汇总java日期时出现意外结果

LNy*_*rla 0 java datetime

当使用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()));
Run Code Online (Sandbox Code Playgroud)

这是输出:

Mon Mar 20 00:00:00 CET 2017
Thu Jan 01 10:44:00 CET 1970
Mon Mar 20 09:44:00 CET 2017
Run Code Online (Sandbox Code Playgroud)

我希望2017年3月20日10:44:00 CET 2017而不是Mon Mar 20 09:44:00 CET 2017.

我错过了什么?

提前致谢.

isn*_*bad 5

让我们忽略这样一个事实,即总结日期完全是胡说八道(日期是时间轴上的一个点 - 添加根本没有为日期定义 - 您可以为日期添加持续时间或总结两个持续时间,但从不两个日期).

问题是你的日期是在欧洲中部时区(CET),所以你提前一小时.

d1.getTime()返回格林威治标准时间 1970年1月1日以来的毫秒数,所以如果你Date在你的时区(我猜想是CET)中为这个日期(1/jan/1970)创建一个新对象,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));
Run Code Online (Sandbox Code Playgroud)