【发布时间】:2011-10-14 01:20:06
【问题描述】:
如果我运行以下程序,它会解析两个引用时间相隔 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
【问题讨论】:
-
真正的答案是始终,始终使用自纪元以来的秒数进行日志记录,如 Unix 纪元,使用 64 位整数表示(签名,如果你想在纪元之前允许戳记)。任何现实世界的时间系统都有一些非线性、非单调的行为,例如闰小时或夏令时。
-
关于这类事情的精彩视频:youtube.com/watch?v=-5wpm-gesOY
-
另一个来自同一个人,@ThorbjørnRavnAndersen:youtube.com/watch?v=Uqjg8Kk1HXo(闰秒)。 (这个来自 Tom Scott 自己的 YouTube 频道,不是来自 Computerphile。)
-
@Phil H “自纪元以来的秒数”(即 Unix 时间)也是非线性的,因为 POSIX 秒不是 SI 秒并且长度不同
-
Unix 时间也不是单调的,如果你包括亚秒(常见于日志应用程序)。它会在闰秒内向后跳。