7

2日間の差を日数で計算しようとしています。何らかの理由で、01-03-2013 と 01-04-2013 を比較すると結果は 30 になり、01-03-2013 と 31-03-2013 を比較しても同様です。

Calendar cal = Calendar.getInstance();
cal.clear();

cal.set(2013, Calendar.MARCH, 1);
Date start = cal.getTime();

cal.set(2013, Calendar.APRIL, 1);
Date end = cal.getTime();

long days = TimeUnit.MILLISECONDS.toDays(end.getTime() - start.getTime());
System.out.println("!!! Amount of days : " + String.valueOf(days));

>> 30

cal.set(2013, Calendar.MARCH, 1);
start = cal.getTime();

cal.set(2013, Calendar.MARCH, 31);
end = cal.getTime();

days = TimeUnit.MILLISECONDS.toDays(end.getTime() - start.getTime());
System.out.println("!!! Amount of days : " + String.valueOf(days));

>> 30

どうしてこれなの?

4

4 に答える 4

8

3 月 31 日にタイム ゾーンで夏時間が開始された場合、これらの結果が得られます。

3 月 1 日から 4 月 1 日までの間は、夏時間が始まるため、24 時間制の 1 日が 30 日、23 時間制の 1 日が 1 日となります。ミリ秒の合計数を 24 x 60 x 60 x 1000 で割ると、30 プラス 23/24 が得られます。これは 30 に切り捨てられます。

于 2014-02-03T09:33:01.717 に答える
0

このバージョンのコードを米国西海岸のタイム ゾーンで実行すると、次のようになります。

java.util.Calendar cal = java.util.Calendar.getInstance();
cal.clear();

cal.set( 2013, java.util.Calendar.MARCH, 1 );
java.util.Date start = cal.getTime();

cal.set( 2013, java.util.Calendar.APRIL, 1 );
java.util.Date end = cal.getTime();

long days = java.util.concurrent.TimeUnit.MILLISECONDS.toDays( end.getTime() - start.getTime() );
System.out.println( "!!! Amount of days : " + String.valueOf( days ) );

cal.set( 2013, java.util.Calendar.MARCH, 1 );
start = cal.getTime();

cal.set( 2013, java.util.Calendar.MARCH, 31 );
end = cal.getTime();

days = java.util.concurrent.TimeUnit.MILLISECONDS.toDays( end.getTime() - start.getTime() );
System.out.println( "!!! Amount of days : " + String.valueOf( days ) );

私は得る:

!!! Amount of days : 30
!!! Amount of days : 29

説明については、この回答に関する David Wallace のコメントを参照してください。

サマータイム (米国) 2013 年は、3 月 10 日日曜日の午前 2 時に始まりました。

于 2014-02-03T09:33:04.627 に答える
0

システムで同じコードを実行すると、次のような出力が得られます。

!!! Amount of days : 31

コードをもう一度確認してください。

于 2014-02-03T09:24:06.723 に答える