3

全て、

TimeStampフィールドが「2000年1月1日UTC時間からのミリ秒」として定義されているバイナリ仕様を使用しています。私は次の計算を行っています:

public static final TimeZone UTC = TimeZone.getTimeZone("UTC") ;
public static final Calendar Y2K_EPOCH = Calendar.getInstance(UTC);
static {
    Y2K_EPOCH.clear();
    // Month is 0 based; day is 1 based.  Reset time to be first second of January 1, 2000
    Y2K_EPOCH.set(2000, 0, 1, 0, 0, 0);
}
public static final long MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH = Y2K_EPOCH.getTimeInMillis();

public static long getMillisecondsSinceY2K(Date date) {
    long time = date.getTime();
    if (time < MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH) {
        throw new IllegalArgumentException("Date must occur after January 1, 2000");
    }
    return time - MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH;
}

私の質問は、これが標準のJava Dateオブジェクトとこのデータ型の間の変換を行う正しい方法ですか?これを行うためのより良い方法はありますか?私はJodaの時間について知っていますが、私がそれを助けることができれば、その外部依存関係を持ち込みたくありません。

4

2 に答える 2

1

は、私にはよく見えますよ。

変更できることに注意してください

long time = date.getTime();
if (time < MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH)
    ...

if (date.before(Y2K_EPOCH))
    ...

うるう秒についての心配については、ドキュメントからの抜粋です。

Dateクラスは協定世界時(UTC)を反映することを目的としていますが、Java仮想マシンのホスト環境によっては正確に反映されない場合があります。ほぼすべての最新のオペレーティングシステムは、すべての場合で1日=24×60×60=86400秒と想定しています。ただし、UTCでは、約1〜2年に1回、「うるう秒」と呼ばれる余分な秒があります。うるう秒は常にその日の最後の秒として追加され、常に12月31日または6月30日に追加されます。たとえば、うるう秒が追加されたおかげで、1995年の最後の1分は61秒でした。ほとんどのコンピューターの時計は、うるう秒の区別を反映できるほど正確ではありません。

于 2011-04-05T15:25:13.053 に答える
0

時間はトリッキーな混乱であり、特にUTC時間です。任意のエポックに基づいてかなり良い時間を必要としていると仮定すると、あなたがしているような単純な減算は問題ないはずです。うるう秒の精度が心配な場合は、Jodaまたは信頼できる外部ライブラリを使用することを強くお勧めします。

于 2011-04-05T15:26:01.490 に答える