问题
夏令时只有 23 个小时。
并根据1976 年 3 月 28 日至少在巴黎是夏令时。那天凌晨1点到2点之间的时间根本不存在。
虽然这肯定是一个区域设置问题,因为在我的计算机上我得到了正确的结果:
scala> val days1 = (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis())) / (1000 * 3600 * 24)
days1: Long = 13203
scala> val days2 = (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis())) / (1000 * 3600 * 24)
days2: Long = 13202
那天我不在巴黎或其他任何有时间变化的地方;我所在的时间是1976年4月25日。所以我在该日期得到了“跳过一天”的行为:
scala> val days3 = (dateToday - (new GregorianCalendar(1976, Calendar.APRIL, 25).getTimeInMillis())) / (1000 * 3600 * 24)
days3: Long = 13175
scala> val days4 = (dateToday - (new GregorianCalendar(1976, Calendar.APRIL, 26).getTimeInMillis())) / (1000 * 3600 * 24)
days4: Long = 13175
Erwin 在评论中指出,您在这里唯一注意到不正确的日期差异的可能原因是,当夏令时被纠正时,所有其他夏令日都被那些年份中也发生的 25 小时日所抵消。
解决方案
使用更好的库进行日期处理。这乔达时间 http://joda-time.sourceforge.net/库正确地做到了这一点(并且总体上是一个更好的日期/时间框架):
import org.joda.time.Days
import org.joda.time.DateTimeConstants
import org.joda.time.DateMidnight
val d1 = new DateMidnight(1976, DateTimeConstants.APRIL, 25)
val d2 = new DateMidnight(1976, DateTimeConstants.APRIL, 26)
val x = Days.daysBetween(d1, d2).getDays()
println(x) // 1