GregorianCalendar.getTimeInMillis()が間違った値を返すのはなぜですか?

おいしい

2つの日付の間の日数の形式で時間差を計算したいと思います。だから私は次のコードを書いた:

public static int calculateTimeGap(long start, long end) {
    GregorianCalendar calendar1 = new GregorianCalendar();
    calendar1.setTimeInMillis(start);
    System.out.println("calendar1:");
    showCalendar(calendar1);

    GregorianCalendar calendar2 = new GregorianCalendar();
    calendar2.setTimeInMillis(end);
    System.out.println("calendar2:");
    showCalendar(calendar2);

    int gap = (int) (end / 86400000 - start / 86400000);
    System.out.println("gap in days:" + gap);
    return gap;
}

出力は次のとおりです。

03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: calendar1:
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: year: 2016
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: month: 3
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: day: 2
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: week: 3
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: hour: 15
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: minute: 28
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: second: 8
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out:  
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: calendar2:
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: year: 2016
03-02 15:28:08.021 20814-20814/com.ywwynm.everythingdone I/System.out: month: 3
03-02 15:28:08.022 20814-20814/com.ywwynm.everythingdone I/System.out: day: 3
03-02 15:28:08.022 20814-20814/com.ywwynm.everythingdone I/System.out: week: 4
03-02 15:28:08.022 20814-20814/com.ywwynm.everythingdone I/System.out: hour: 1
03-02 15:28:08.022 20814-20814/com.ywwynm.everythingdone I/System.out: minute: 0
03-02 15:28:08.022 20814-20814/com.ywwynm.everythingdone I/System.out: second: 0
03-02 15:28:08.022 20814-20814/com.ywwynm.everythingdone I/System.out:  
03-02 15:28:08.022 20814-20814/com.ywwynm.everythingdone I/System.out: gap in days:0

2つGregorianCalendarのが異なる日を示していることがわかりますが、最終的には0に等しいギャップが得られました。

このメソッドのパラメーター、startおよびはend、次のコードから取得されます。

GregorianCalendar curCalendar = new GregorianCalendar();
long start = curCalendar.getTimeInMillis(); // parameter start

GregorianCalendar calendar = new GregorianCalendar(2016, Calendar.MARCH, 3, 1, 0);
long end = calendar.getTimeInMillis(); // parameter end

したがって、動作は非常に奇妙です。これgregorianCalendar.getTimeInMillis()は常に正確でタイムゾーンに依存しない値を返すので、時間を計算して比較するための安定した信頼できる標準として使用できると思いました。ただし、コードと出力が示すように、それは間違っています。また、タイムゾーン(北京GMT + 8:00)を考慮した場合Timezone.getDefault().getRawOffset()、パラメータにオフセットを追加するstart、パラメータにマイナス追加するendと、結果は正しくなります。しかし、これは実際には奇妙です。

なぜ間違った結果が得られたのですか?

更新:

public static void showCalendar(GregorianCalendar calendar) {
    System.out.println("year: "   +  calendar.get(Calendar.YEAR));
    System.out.println("month: "  + (calendar.get(Calendar.MONTH) + 1));
    System.out.println("day: "    +  calendar.get(Calendar.DATE));
    System.out.println("week: "   + (calendar.get(Calendar.DAY_OF_WEEK) - 1));
    System.out.println("hour: "   +  calendar.get(Calendar.HOUR_OF_DAY));
    System.out.println("minute: " +  calendar.get(Calendar.MINUTE));
    System.out.println("second: " +  calendar.get(Calendar.SECOND));
    System.out.println(" ");
}
ジョンスキート

2つのGregorianCalendarが異なる日を示していることがわかりますが、最終的にギャップは0になります。

はい、それは完全に合理的です。3月2日の15:28:08と3月3日の01:00:00を比較しています。それらは異なる日付にありますが、1日未満の間隔です。ここでは問題ありません。

ちなみに、わずか1ミリ秒離れている2つの値でも同じことがわかります。これらの値は、異なる日付である可能性があります。

タイムゾーンに関しては、デフォルトでGregorianCalendarシステムのデフォルトのタイムゾーンが使用されることに注意してください。によって返される値はgetTimeInMillis、Unixエポックからのミリ秒数を常に返すため、タイムゾーンは中立ですが、ここで呼び出しているコンストラクターは次のとおりです。

new GregorianCalendar(2016, Calendar.MARCH, 3, 1, 0)

...は、「3月3日午前1時の現地時間を表す値が必要です」と言っています。ここで、現地時間は「デフォルトのタイムゾーン内」を意味します。

日付の違いを計算するのは難しいです。Java8使用している場合は代わりに、それ以外の場合はJoda Time使用すること強くお勧めします次に、を使用して時刻のない日付を表し、2つの日付の違いを簡単に見つけることができます。CalendarDatejava.timeLocalDate

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Java GregorianCalendar何が問題なのですか?間違った日付ですか?

分類Dev

XMLGregorianCalendarからGregorianCalendarへ

分類Dev

GregorianCalendar DSTの問題

分類Dev

Android-GregorianCalendarが間違った月を表示する

分類Dev

GregorianCalendarでの奇妙な動作

分類Dev

SimpleDateFormatでのGregorianCalendarの使用

分類Dev

JavaのGregorianCalendarクラス

分類Dev

UTCでHOUR_OF_DAYを0に設定すると、GregorianCalendarが日を変更するのはなぜですか?

分類Dev

Calendar.getInstance()とGregorianCalendar.getInstance()の違い

分類Dev

1時間オフのJava gregoriancalendar

分類Dev

文字列をGregorianCalendarに変換します

分類Dev

文字列をGregorianCalendarに変換します

分類Dev

Kotlinデータクラスとjson-GregorianCalendarが間違った日付を表示する

分類Dev

DAY_OF_WEEKは、Java GregorianCalendarで常に7を返します

分類Dev

JavaFX TableViewでGregorianCalendarを使用する方法はありますか?

分類Dev

このasmstrcmp()が間違った値を返すのはなぜですか

分類Dev

「col」変数が間違った値を返すのはなぜですか

分類Dev

INDEX / MATCH関数が間違った値を返すのはなぜですか?

分類Dev

コードが間違った値を返すのはなぜですか?

分類Dev

toJSONが間違った値を返すのはなぜですか

分類Dev

BinaryReader.ReadDecimal()が間違った値を返すのはなぜですか?

分類Dev

GregorianCalendarから1日を減算すると、時間は破損します

分類Dev

JavaのGregorianCalendarクラスとCalendarクラスの違いは?

分類Dev

夏時間でのGregorianCalendar.set()の動作

分類Dev

ミリ秒からGregorianCalendarインスタンスを作成する

分類Dev

GregorianCalendarからgc.setTime()を修正する方法

分類Dev

GregorianCalendarを複製する最も速い方法は?

分類Dev

ChineseLunisolarCalendarからGregorianCalendarへの無効な日付

分類Dev

経過時間を決定するためのGregorianCalendarのインスタンスを使用していますか?

Related 関連記事

  1. 1

    Java GregorianCalendar何が問題なのですか?間違った日付ですか?

  2. 2

    XMLGregorianCalendarからGregorianCalendarへ

  3. 3

    GregorianCalendar DSTの問題

  4. 4

    Android-GregorianCalendarが間違った月を表示する

  5. 5

    GregorianCalendarでの奇妙な動作

  6. 6

    SimpleDateFormatでのGregorianCalendarの使用

  7. 7

    JavaのGregorianCalendarクラス

  8. 8

    UTCでHOUR_OF_DAYを0に設定すると、GregorianCalendarが日を変更するのはなぜですか?

  9. 9

    Calendar.getInstance()とGregorianCalendar.getInstance()の違い

  10. 10

    1時間オフのJava gregoriancalendar

  11. 11

    文字列をGregorianCalendarに変換します

  12. 12

    文字列をGregorianCalendarに変換します

  13. 13

    Kotlinデータクラスとjson-GregorianCalendarが間違った日付を表示する

  14. 14

    DAY_OF_WEEKは、Java GregorianCalendarで常に7を返します

  15. 15

    JavaFX TableViewでGregorianCalendarを使用する方法はありますか?

  16. 16

    このasmstrcmp()が間違った値を返すのはなぜですか

  17. 17

    「col」変数が間違った値を返すのはなぜですか

  18. 18

    INDEX / MATCH関数が間違った値を返すのはなぜですか?

  19. 19

    コードが間違った値を返すのはなぜですか?

  20. 20

    toJSONが間違った値を返すのはなぜですか

  21. 21

    BinaryReader.ReadDecimal()が間違った値を返すのはなぜですか?

  22. 22

    GregorianCalendarから1日を減算すると、時間は破損します

  23. 23

    JavaのGregorianCalendarクラスとCalendarクラスの違いは?

  24. 24

    夏時間でのGregorianCalendar.set()の動作

  25. 25

    ミリ秒からGregorianCalendarインスタンスを作成する

  26. 26

    GregorianCalendarからgc.setTime()を修正する方法

  27. 27

    GregorianCalendarを複製する最も速い方法は?

  28. 28

    ChineseLunisolarCalendarからGregorianCalendarへの無効な日付

  29. 29

    経過時間を決定するためのGregorianCalendarのインスタンスを使用していますか?

ホットタグ

アーカイブ