0

Googleスプレッドシートに日付を追加しようとしました。日付を追加するには、日付をエポックに変換します。スプレッドシートのエポックのためにGoogle SpreadSheetのJavaエポック日付

Googleシートは、一般的にスプレッドシートで使用されているエポック日付の形式を使用しています。値の全数部分(小数点の左側)は、1899年12月30日以降の日数をカウントします。分数部分(小数点の右側)は、時間を1日の小数部としてカウントします。たとえば、正午の1900年1月1日は、正午が半日なので、1899年12月30日の2日後と.5のため2.5、2となります。 1900年2月1日午後3時は33.625となります。

Joda時間APIを使用して計算しています(JDKバージョン1.7)。

私たちは以下のコードを使用しています。

public static double getEpochDate(Date inputDate) 
{ 

    MutableDateTime epoch = new MutableDateTime(); 
    epoch.setTime(0, 0, 0, 0); 
    epoch.setDate(1899,12,30); //Set to Epoch time 
    System.out.println(epoch); 
    DateTime now = new DateTime(inputDate); 
    Days days = Days.daysBetween(epoch, now); 


    return Double.valueOf(days.getDays()); 
} 

我々は

答えて

3

一つの選択肢は、値「Unixエポックからのミリ秒」を取ることであろうエポック番号の派閥の一部を見つけるために、問題に直面している(例えばDate.getTime()付き)、それは以降」ミリ秒を取得するためにオフセットSheets epoch」を実行し、24時間で浮動小数点除算を実行します。このようなもの:

// Precomputed difference between the Unix epoch and the Sheets epoch. 
private static final long SHEETS_EPOCH_DIFFERENCE = -2209161600000L; 

public static double getEpochDate(Date date) 
{ 
    long millisSinceUnixEpoch = date.getTime(); 
    long millisSinceSheetsEpoch = millisSinceUnixEpoch - SHEETS_EPOCH_DIFFERENCE; 
    return millisSinceSheetsEpoch/(double) TimeUnit.DAYS.toMillis(1); 
} 

この場合、Joda時間は必要ありません。

+0

(あなたは ...私は強くMutable*種類を回避助言する。そして、唯一の関与の時間帯が本当にありますときDateTimeを使用したい、ジョダ時間を使いたいんときは)非常に迅速な応答をありがとうございました。 -2209161600000Lからマイナス記号を削除するだけで、すべての計算が完璧に機能します。日付は1899年12月30日から計算されるので、Unix Epochから追加するだけです。 –

+0

@ GauravAshara:それを加算するのではなく定数を減算する...どちらの方法でも動作します。私はそれに応じて答えを変更しました。 –

+0

:もちろんです。ありがとう –

関連する問題