java - java.util.GregorianCalendar 在 1976 年 3 月 28 日到 3 月 29 日之间发生了什么?

标签 java scala date long-integer gregorian-calendar

尝试使用 GregorianCalendar 时,我在计算自特定日期以来的天数时遇到了奇点。 在 scala 解释器中,我输入了:

scala>import java.util.GregorianCalendar
scala>import java.util.Calendar
scala>val dateToday = new GregorianCalendar(2012,Calendar.MAY,22).getTimeInMillis()
dateToday: Long = 1337637600000
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 = 13203

我不知道 1976 年是闰年这一事实是否重要,但 days1 和 days2 应该被 1 隔开。这是自 1970 年以来历史上唯一发生这种奇点的时刻。

想知道发生了什么,我计算了前面提到的两个日期之间的差异,它只给了我 23 小时的差异!那天发生了什么?维基百科显然对此只字未提。

更重要的是,如何计算自特定日期以来的实际天数?

最佳答案

问题

夏令时只有 23 小时。

根据 this至少在巴黎,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 小时制所抵消,当夏令时已更正。

解决方案

使用更好的库进行日期处理。 joda-time库正确地做到了(以及整体上更好的日期/时间框架):

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

关于java - java.util.GregorianCalendar 在 1976 年 3 月 28 日到 3 月 29 日之间发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10698470/

相关文章:

java - 如何在 Java 中使用数组的一部分初始化列表

java - Delphi 中有哈希数组吗?

javascript - 创建一个依赖于当前时间的 mongo View

javascript - 设置时间范围

date - 如何解决 h :inputText with Date value? 中的 "Conversion Error setting value ' 2013-10-2 6' for ' null Converter'"

java - 将 Collection<String[]> 流转换为 List<String>[]

java - 将图像从 url 添加到 viewpager 的第二和第三位置

Scala 方法来转换点数组

scala - 不可变泛型类的特定于类型的函数

scala 中的 Java 类类型不匹配?