首页 > 解决方案 > 使用巴西夏令时 (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

标签: javadatedatetimedst

解决方案


这里有两个问题:

  • 您的 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) 编写大量测试。您需要做什么的确切细节将取决于您的业务规则。(根据我的经验,决定这些业务规则的人很可能还没有考虑到这一点。不要让他们随意挥手:要求精确的规范。礼貌,当然:)


推荐阅读