1. 为什么1927年的两个日期相减会得到奇怪的结果| Java Debug 笔记

744 阅读2分钟

本文正在参加「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正在将其解析为该本地日期的后一次的时间,因此答案与预期有所不同。

详情见此页(外网访问不大方便,这里直接放一张图)

image.png

回答2:

这类问题的解决办法

  • 尽可能在UTC中使用日期和时间。
  • 如果您无法使用UTC显示日期或时间,通常可以用显式指示时区的方法解决问题。
  • 如果您不能使用UTC输入日期/时间,则需要一个明确指示的时区。