Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
1976年3月28日和3月29日之间,java.util.GregorianCalendar发生了什么?_Java_Scala_Date_Long Integer_Gregorian Calendar - Fatal编程技术网

1976年3月28日和3月29日之间,java.util.GregorianCalendar发生了什么?

1976年3月28日和3月29日之间,java.util.GregorianCalendar发生了什么?,java,scala,date,long-integer,gregorian-calendar,Java,Scala,Date,Long Integer,Gregorian Calendar,试图使用GregoriaCalendar,我在计算某个特定日期后的天数时遇到了一个奇点。 在scala解释器中,我输入: scala>import java.util.GregorianCalendar scala>import java.util.Calendar scala>val dateToday = new GregorianCalendar(2012,Calendar.MAY,22).getTimeInMillis() dateToday: Long = 13376

试图使用GregoriaCalendar,我在计算某个特定日期后的天数时遇到了一个奇点。 在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小时长

根据3月28日的说法,1976年至少在巴黎是夏令时。那天凌晨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小时日所抵消

解决方案 使用更好的库进行数据处理。库正确地完成了这项工作(总体而言,它是一个更好的日期/时间框架):


dhg指出了我的想法:这一天是“夏令时”日。 由于这一天只有23小时长,欧几里得除以一天等于0

事实上,使用GregorianCalendar对象只使用以毫秒为单位的日期,因此除以一天作为整数只会截断结果


不要使用欧几里得(整数)除法,尝试使用浮点除法,然后对结果进行四舍五入。

如果无法使用浮点除法,我能想到的最佳答案是在计算两天之间的差值时加上一小时(1000*3600):

scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13204
scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13203

它应该适用于每个日期,因为你不再受闰时的困扰。

好吧,但为什么只在这个日期?从那以后有这么多的夏令时。那么如何绕过这个问题来计算从那以后的天数呢?也许其他所有日期上缺失或增加的1小时都被抵消了(1-1+1-1+1-1+1=1)@meak:这也应该发生在这个日期之后。然而,这是夏令时在法国(重新)引入的第一天,因此在这之前不应该发生。你应该将
dateToday
a
def
,否则,随着使用时间的延长,偏移量会越来越奇怪。当然,别担心,这只是为了确保日期对每个人都是正确的。在最初的代码中,我编写了Calendar.getInstance().getTimeInMillis()。我的意思是,您应该为我们测试人员在SO上创建一个
def
。)好的,我明白了,我应该把
dateToday
重命名为
DateWhere,如果它发现了大的DateBug
GregorianCalendar
是否处理闰秒?闰时?如果你指的是夏令时(更可能的罪魁祸首),那么并非所有实行DST的国家都在午夜进行。@X-0闰秒。每隔这么多年,就会增加或减少一秒钟来解释地球轨道的变化。是的,但是
日历和
格里高利安达尔图都没有提到,所以我怀疑情况是否如此
Date
提到了它们,但似乎是旁白,因为它们指出“大多数计算机时钟不够精确,无法反映闰秒的区别。”因此,使用和实现是特定于实现的(文档中给出的示例不会在我的机器上产生闰秒).我似乎记得,在Java中,闰秒的使用(或不使用)取决于实现。
scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13204
scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13203