比較 - Java.util.Calendar-1970年1月1日以降のミリ秒




java カレンダー 作成 (4)

プログラムに続いて出力。 1970年1月1日から1,000,000ミリ秒が1969年11月31日である理由を教えてください。最初のテストで1970年1月1日から10,000,000ミリ秒が生成されるという私の前提に間違いがあることをご説明ください。同じ結果。

public static void main(String[] args) {

    String x = "10000000";
    long l = new Long(x).longValue();
    System.out.println("Long value: " + l);

    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);

    x = "1000000000000";
    l = new Long(x).longValue();
    System.out.println("\nLong value: " + l);

    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);
}

長い値:10000000

ミリ秒単位のカレンダー時間:10000000

YYYY-MM-DD形式の日付:1969-11-31

長い値:1000000000000

ミリ秒単位のカレンダー時間:1000000000000

YYYY-MM-DD形式の日付:2001-8-8


Calendar#setTimeInMillis()は、 GMT 1970年1月1日以降のカレンダーの時刻をミリ秒数に設定します。

Calendar#get()はカレンダーのタイムゾーンに合わせて調整されたリクエストされたフィールドを返します。デフォルトではマシンのローカルタイムゾーンです。

カレンダーを作成するときに "GMT"タイムゾーンを指定すると、これは期待どおりに動作します。

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

Calendarから印刷した日付はあなたのタイムゾーンにローカルですが、エポックはUTCで1970-01-01の真夜中であると定義されています。 したがって、あなたがUTCの西側のタイムゾーンに住んでいる場合、日付は1969-12-31として表示されます(UTCでは1970-01-01ですが)。


あなたのタイムゾーンはGMT(GMT-5など)より遅れている可能性が高いため、エポックからの10,000,000msは1969年12月31日のタイムゾーンですが、java.util.Calendarでは月が0から始まるため、カレンダー→テキスト変換に欠陥があります予想される1969-12-31の代わりに1969-11-31が得られます。


悲しいことに、 java.util.Datejava.util.Calendarはこの種の混乱を招くように設計されていませんでした。





calendar