java - 使用巴西夏令时 (BRST) 时的日期格式错误
问题描述
从可变日期中删除时间时出现问题(Sun Oct 21 01:00:00 BRST 2018
) 中删除时间时遇到问题,因为当数据来自具有 1 小时差异的数据库时,它会产生计费错误。
这只发生在巴西夏季的第一天
我已经尝试过使用该Calendar
课程。
public static Date zeroTimes( final Date data ) {
Calendar cal = Calendar.getInstance();
cal.setTime( data );
cal.add( Calendar.HOUR, - 1 );
return cal.getTime();
}
此方法的返回是 this Sun Oct 21 01:00:00 BRST 2018
,但预期的是Sun Oct 21 00:00:00 BRST 2018
解决方案
这里有两个问题:
- 您的 JVM 有过时的时区数据
- 根据陈旧的时区数据,您正试图从凌晨 1 点减去该日期不存在午夜的一小时。
2017 年 12 月,巴西政府更改了夏令时规则,使夏令时从 11 月的第一个星期日开始。请参阅此葡萄牙语页面或此英文页面以获取参考。
因此,虽然 2018 年的夏季时间实际上从 11 月 4 日开始,但看起来你的 JVM 认为它从 10 月 21 日开始。如果是这种情况,12am 将不存在,因此 1am 将显示为该日期的开始。你还没有告诉我们你在Date
对象中得到了什么价值,但我认为这就是问题所在。
java.util.Date
首先,如果可以的话,我会停止使用。在很多方面,这些java.time
类型要好得多。如果您卡在旧版本的 Java 上,请使用JSR-310 反向移植。
其次,更新您的时区数据。请参阅此页面了解更多信息。
第三,确定您希望如何处理 DST 转换。这是我们可能无法给出太多建议的地方,除了 a) 明确地考虑它;b) 编写大量测试。您需要做什么的确切细节将取决于您的业务规则。(根据我的经验,决定这些业务规则的人很可能还没有考虑到这一点。不要让他们随意挥手:要求精确的规范。礼貌,当然:)
推荐阅读
- python - 排序如何比线性(低常数)更快?
- vim - Gcommit 后自动关闭 Gstatus 窗口或在同一窗口中打开 Gcommit
- terraform - 使用 terraform 0.12 中的列表迭代地图
- flutter - 使用从 textField 存储的数据操作字符串 - 颤振/飞镖
- sql - 为什么我在创建表时出错,Oracle 错误代码是:“ORA-00903:无效的表名”
- c# - .NetCore 2.2:web.config -> 第三方工具的 appsettings 转换
- elixir - Elixir - 通过“Mix.shell.cmd”启动时,“混合测试”有时会挂起
- javascript - 多次点击标记时谷歌地图动画问题
- node.js - 尝试代理时出错:localhost:3000/api/register in register form
- curl - Paw cURL 导入将 \ 更改为 %5C