本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:为什么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年底的午夜,时钟倒退了5分52秒。因此,“ 1927-12-31 23:54:08”实际上发生了两次,并且看起来Java正在将其解析为该本地日期的后一次的时间,因此答案与预期有所不同。
详情见此页(外网访问不大方便,这里直接放一张图)
回答2:
这类问题的解决办法
- 尽可能在UTC中使用日期和时间。
- 如果您无法使用UTC显示日期或时间,通常可以用显式指示时区的方法解决问题。
- 如果您不能使用UTC输入日期/时间,则需要一个明确指示的时区。