TimeUnit クラスの動作がおかしいことに気がついたので、再現するためにこの最小限の例を作成しました。
long differenceInDays;
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTimeInMillis(1466062306000l); // Thu Jun 16 2016 09:31:46 GMT+0200
c2.setTimeInMillis(1466028000000l); // Thu Jun 16 2016 00:00:00 GMT+0200
differenceInDays = TimeUnit.DAYS.convert(c2.getTimeInMillis() - c1.getTimeInMillis(), TimeUnit.MILLISECONDS);
System.out.println(differenceInDays); // obviously zero
c2.add(Calendar.DATE, +1);
differenceInDays = TimeUnit.DAYS.convert(c2.getTimeInMillis() - c1.getTimeInMillis(), TimeUnit.MILLISECONDS);
System.out.println(differenceInDays); // why zero and not one?
c2.add(Calendar.DATE, +1);
differenceInDays = TimeUnit.DAYS.convert(c2.getTimeInMillis() - c1.getTimeInMillis(), TimeUnit.MILLISECONDS);
System.out.println(differenceInDays); // suddenly a 1, but not a 2 like expected
最初に差が計算されたときは明らかに 0 です。これは、2 つの日付の間に 1 日が存在するわけではないためです。
しかし、2 回目は丸 1 日を加算するのに、どうして差がまだ 0 になるのでしょうか?
出力:
0
0
1
この問題は夏時間やうるう年に関連しているとは思いません。同じ年、さらには月内でしか計算を行っていないからです。
これは、チェックするための日付からミリ秒への計算機です。