1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Java] java.util.Date型からシリアル値を取得する

Posted at

JavaでGoogle Sheets APIを使用する上で
エクセルやスプレットシート上で扱うシリアル値を扱う必要が出てきましたので
簡単にはですがここに備忘録として残します。

シリアル値とは?
1900年1月1日を1として何経過したかを示す値

UNIX時間とは?
1970年1月1日 0時0分0秒を0として何経過したかを示す値

1. Date型からシリアル値に変更する際の考え方

UNIX時間を日数に変更して、シリアル値とUNIX時間の日数の差を足します。

① UNIX時間を日数に変更
 getTimeで取得したUNIX時間(ミリ秒)を1日のミリ秒で割って日数にします。
 もし、Dateが日本標準時の場合は、割る前のミリ秒に9時間(ミリ秒)を足します。

 date.getTime()/(24*60*60*1000)
//(date.getTime()+(9*60*60*1000))/(24*60*60*1000)

② 1900年1月1日と1970年1月1日の差を足す
 0スタート、1スタートの違いと閏年も考えて、日数を差を足します。
 差分は「25569」となります。
 プログラムで出していますが、不変の値なので固定値を使用します。

LocalDateTime t1 = LocalDateTime.of(1900,1,1,0,0);
LocalDateTime t2 = LocalDateTime.of(1970,1,1,0,0);
long diff = Duration.between(t1,t2).toDays();

//その日も含めるので+1(例えば、3/1と3/2の差分は1日ですが、3/2の終わりまでの差分は+1の2日)
//片方が0スタートなので+1
System.out.println(diff+1+1);

2. プログラム

実行環境を考えれば普通はJSTですが、DBに保存した値などを使う場合を考えて
Date型がJSTとUTCのパターンを記します。

java.util.DateがJST(日本標準時)の場合

Date date = new Date();

(int)((date.getTime()+(9*60*60*1000))/(24*60*60*1000)) + 25569;

java.util.DateがUTC(協定世界時)の場合

Date date = new Date();

(int)(date.getTime()/(24*60*60*1000)) + 25569;


おしまい。。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?