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つの日付の違いを簡単に見つけることができます。Calendar
Date
java.time
LocalDate
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加