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;
おしまい。。