java DateFormat正在将新日期(0)打印为纪元+1小时
以下测试失败:
DateFormat df = new SimpleDateFormat("HH:mm:ss z");
assertEquals("00:00:00 GMT", df.format(new Date(0)));
预期为“00:00:00 GMT”,但实际为“01:00:00 GMT”
有人能指出我在哪里犯傻吗
我花了更长的时间来研究这件事,而不是用乔达的时间来取代一切。那里有个教训
你可以在下面搜索框中键入要查询的问题!
以下测试失败:
DateFormat df = new SimpleDateFormat("HH:mm:ss z");
assertEquals("00:00:00 GMT", df.format(new Date(0)));
预期为“00:00:00 GMT”,但实际为“01:00:00 GMT”
有人能指出我在哪里犯傻吗
我花了更长的时间来研究这件事,而不是用乔达的时间来取代一切。那里有个教训
# 1 楼答案
new Date(0)returns分配一个日期对象,并对其进行初始化,以表示自称为“历元”的标准基准时间(即1970年1月1日00:00 GMT)以来的指定毫秒数
因此,该值将为1970年1月1日星期四05:30:00
“05:30:00”取决于您所在的位置
# 2 楼答案
问题是,Java在1970年的欧洲/伦敦时区缩写名称周围有一个bug
1970年冬天,英国仍然使用UTC+1,但爪哇认为它仍然被称为“GMT”。所以你看到的是1970年1月1日UTC午夜的本地时间。。。只是我们习惯了GMT=UTC,这就是为什么它令人困惑
(顺便说一句,即使现在也值得转换成Joda Time。避免像瘟疫这样的内置库:)
Joda Time将时区缩写打印为“BST”。这似乎同样奇怪,因为它显然不是夏天。。。但有可能“s”在这里代表标准,就像“英国标准时间实验”期间那样。详见Wikipedia
(请注意,UTC本身在Unix时代甚至都不存在——它是在1972年引入的。为了这个答案,我假设一个预期的UTC:)