5

Timestamp((long)-62135596800000L) が 0001-01-03 00:00:00 を返すのに、 0001-01-01 00:00:00を返さなければならないのはなぜですか? このサービスは正しいタイムスタンプをここに表示します

ここに画像の説明を入力

4

1 に答える 1

13

-62135596800000is 0001-01-03 00:00:00.0デフォルトでは、Java は 1582 年 10 月 15 日より前の日付にユリウス暦を使用するためです。

あなたが使用しているウェブサイトは、すべての日付に外挿された、または先発的なグレゴリオ暦を使用する JavaScript を使用しています。JavaScriptの仕様から

ECMAScript は外挿されたグレゴリオ暦を使用して、日付を年にマップし、その年の月と日付を決定します。

確かに、javascriptで:

new Date(-62135596800000).toUTCString()
//"Mon, 01 Jan 1 00:00:00 GMT"

Java で次のようなものを使用して、同じ結果を得ることができます。

GregorianCalendar date = new GregorianCalendar();
date.clear();
//Use Gregorian calendar for all values
date.setGregorianChange(new Date(Long.MIN_VALUE));

date.setTimeZone( TimeZone.getTimeZone("UTC"));
date.setTime(new Date(-62135596800000L));

System.out.println(
        date.get(GregorianCalendar.YEAR) + "-" +
        (date.get(GregorianCalendar.MONTH) + 1) + "-" + 
        date.get(GregorianCalendar.DAY_OF_YEAR) + " " +
        date.get(GregorianCalendar.HOUR_OF_DAY) + ":" +
        date.get(GregorianCalendar.MINUTE) + ":" + 
        date.get(GregorianCalendar.SECOND) + "." +
        date.get(GregorianCalendar.MILLISECOND)
);
//Prints 1-1-1 0:0:0.0

Calendar残念ながら、オブジェクトからグレゴリオ暦への変更を実行する方法がわからないDateため、カレンダー オブジェクトから直接書式設定を行っています。私がやっ formatter.format(date.getTime())ただけでは、グレゴリオ暦の変更設定が失われ、3 日目が再び表示されます。

これによると、ユリウス暦は紀元前 1 年から西暦 100 年まで、先発グレゴリオ暦より 2 日進んでいるため、ユリウス暦の日付は 2 日進んでいます。


ところで、私JodaTimeはそれを正しく使用することをお勧めします(私の意見ですが、もっと説得力のあるものが必要な場合)デフォルトは純粋なグレゴリオ語です:

DateTime dt = new DateTime(-62135596800000L, DateTimeZone.UTC);
System.out.println(dt.toString());
//0001-01-01T00:00:00.000Z
于 2012-12-02T12:22:14.723 に答える