java - 对 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。
我错过了什么?
提前致谢。
解决方案
让我们忽略一个事实,即总结日期完全是无稽之谈(日期是时间线上的一个点 - 根本没有为日期定义加法 - 您可以将持续时间添加到日期或总结两个持续时间,但绝不是两个日期)。
问题是您的日期位于中欧时区 (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));
推荐阅读
- java - 在项目中找不到 RoomDatabase 类实现中定义的抽象方法
- docker - gitlab/codeceptjs 测试昨天工作正常,现在他们甚至无法启动
- vba - 如何让我的过滤器在 Access 上工作?
- typescript - 在不相关的 VueJS Watcher 中使用“type:Function”的道具会改变“this”的范围
- windows - 批处理文件检查文件夹中具有其他扩展名的相同文件名
- c - 关于 C 中的字符串(作为 cs50 中的变量)的问题
- java - 如何在android应用程序中设置可点击的链接?
- javascript - 在 Node.js 中存储静态数据的更快方法
- c# - 从函数运行的 linq 查询中获取单个字段
- java - 我如何优化 batik svg 以便它可以生成小文件