java - 为什么 2020 年 3 月 30 日和 2020 年 3 月 1 日之间的差异错误地给出了 28 天而不是 29 天?
问题描述
TimeUnit.DAYS.convert(
Math.abs(
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() -
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
),
TimeUnit.MILLISECONDS)
结果是 28,而应该是 29。
时区/位置可能是问题吗?
解决方案
问题在于,由于夏令时转换(2020 年 3 月 8 日星期日),这些日期之间有28 天 23 小时。TimeUnit.DAYS.convert(...)
将结果截断为 28 天。
要查看问题(我在美国东部时区):
SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
fmt.parse("1-03-2020 00:00:00").getTime();
System.out.println(diff);
System.out.println("Days: " + TimeUnit.DAYS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Hours: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS));
System.out.println("Days: " + TimeUnit.HOURS.convert(Math.abs(diff), TimeUnit.MILLISECONDS) / 24.0);
输出
2502000000
Days: 28
Hours: 695
Days: 28.958333333333332
要修复,请使用没有 DST 的时区,例如UTC:
SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
fmt.parse("1-03-2020 00:00:00").getTime();
输出
2505600000
Days: 29
Hours: 696
Days: 29.0
推荐阅读
- spring-boot - 使用密码拒绝用户'root'@'localhost'的访问:在springboot中是YES
- picketlink - 服务提供商的 PicketLink 在 EAP 7.1 中使用 SAML 响应 302
- python - LBPHFaceRecognizer 预测函数总是返回 1
- javascript - 如何在手动 POST 中获取所有复选框
- reactjs - 反应故事书复选框更改处理程序不起作用
- angular - 自定义表单输入组件
- database - 带有模板的 Node-Red 正确格式化输出
- python - 如何使用 Python 手动将标签添加到 matplotlib
- java - 如何在主类 Java 中使用 DAO 模块?
- kubernetes - 限制每个节点具有相同标签的 pod 数量