首页 > 解决方案 > 对 java 日期求和时出现意外结果

问题描述

使用 java.util.Date.getTime() 方法对 java Date 对象求和时,我得到了一个意想不到的结果。

这是示例代码:

System.out.println(d1.toString()); 
System.out.println(d2.toString());
System.out.println(new Date(d1.getTime() + d2.getTime()));

这是输出:

Mon Mar 20 00:00:00 CET 2017
Thu Jan 01 10:44:00 CET 1970
Mon Mar 20 09:44:00 CET 2017

我希望有Mon Mar 20 10:44:00 CET 2017而不是Mon Mar 20 09:44:00 CET 2017

我错过了什么?

提前致谢。

标签: javadatetime

解决方案


让我们忽略一个事实,即总结日期完全是无稽之谈(日期是时间线上的一个点 - 根本没有为日期定义加法 - 您可以将持续时间添加到日期或总结两个持续时间,但绝不是两个日期)。

问题是您的日期位于中欧时区 (CET),因此您提前一小时。

d1.getTime()返回自 1970 年 1 月 1 日GMT以来的毫秒数,因此如果您Date在您的时区(我想是 CET)中为此日期(1/1970 年 1 月)创建一个新对象,getTime()由于时区偏移,将返回 -3600000。

附加信息

如果您真的想为某个时间点添加持续时间,请考虑使用新的Java Time API。它有几种类型来表示日期、时间、日期+时间和持续时间。例如:

LocalDateTime now = LocalDateTime.now();
Duration fiveDays = Duration.ofDays(5);
Period oneYearTwoMonthsThreeDays = Period.of(1, 2, 3);

System.out.println(now);
System.out.println(now.plus(fiveDays));
System.out.println(now.plus(oneYearTwoMonthsThreeDays));

推荐阅读