为什么要减去这两次(在1927年)给出一个奇怪的结果?
如果我运行下面的程序,该程序分析引用时间间隔1秒的两个日期字符串并对它们进行比较:
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str3 = "1927-12-31 23:54:07";
String str4 = "1927-12-31 23:54:08";
Date sDt3 = sf.parse(str3);
Date sDt4 = sf.parse(str4);
long ld3 = sDt3.getTime() /1000;
long ld4 = sDt4.getTime() /1000;
System.out.println(ld4-ld3);
}
输出是:
353
为什么ld4-ld3
不是1
(正如我期望的那样,时间差一秒钟),但是353
?
如果我将日期更改为1秒后的时间:
String str3 = "1927-12-31 23:54:08";
String str4 = "1927-12-31 23:54:09";
那么ld4-ld3
将是1
。
Java版本:
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)
Timezone(`TimeZone.getDefault()`):
sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]
Locale(Locale.getDefault()): zh_CN
这是12月31日上海的时区变化。
有关1927年在上海的详情,请参阅此页。 基本上在1927年底的午夜,时钟回落了5分52秒。 所以“1927-12-31 23:54:08”实际上发生了两次,它看起来像Java解析它作为当地日期/时间的后续可能的时刻 - 因此差异。
在时区的奇怪而美妙的世界中,又是一段情节。
编辑:停止按! 历史更改...
如果使用TZDB版本2013a进行重建,原始问题将不再表现出完全相同的行为。 在2013a中,结果将是358秒,转换时间为23:54:03而不是23:54:08。
我只注意到这一点,因为我在野田时间以单元测试的形式收集类似这样的问题......测试现在已经改变,但它只是表明 - 甚至没有历史数据是安全的。
编辑:历史已经改变了...
在TZDB 2014f中,变化的时间已经到了1900-12-31,现在它只有343秒的变化(所以t
和t+1
之间的时间是344秒,如果你明白我的意思)。
编辑:要回答1900年左右的转换问题......它看起来像Java时区实现将所有时区视为1900年开始之前任何时刻的标准时间:
import java.util.TimeZone;
public class Test {
public static void main(String[] args) throws Exception {
long startOf1900Utc = -2208988800000L;
for (String id : TimeZone.getAvailableIDs()) {
TimeZone zone = TimeZone.getTimeZone(id);
if (zone.getRawOffset() != zone.getOffset(startOf1900Utc - 1)) {
System.out.println(id);
}
}
}
}
上面的代码在Windows机器上没有输出。 因此,任何在1900年初具有任何其他偏移量的时区都将被视为一个转换。 TZDB本身有一些数据早于此,并且不依赖任何“固定”标准时间(这是getRawOffset
假定为有效概念)的概念,所以其他库不需要引入这种人为转换。
您遇到了当地时间不连续问题:
当地方标准时间即将到达星期日时,1928年1月1日00:00:00时钟被转换为0:05:52小时至星期六,1927年12月31日,23:54:08当地标准时间
这并不奇怪,并且由于政治或行政行为而导致时区被切换或更改,因此在任何时候都发生过这样或那样的事情。
这种奇怪的道德是:
上一篇: Why is subtracting these two times (in 1927) giving a strange result?
下一篇: var functionName = function() {} vs function functionName() {}