使用巴西夏令时(BRST)时的日期格式错误

时间:2018-05-02 17:54:51

标签: java date datetime dst

从可变日期(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();

    }

此方法的返回值为Sun Oct 21 01:00:00 BRST 2018, 但预期的是Sun Oct 21 00:00:00 BRST 2018

4 个答案:

答案 0 :(得分:2)

这里有两个问题:

  • 您的JVM有陈旧的时区数据
  • 根据过时的时区数据,您试图从凌晨1点开始减去1小时,而该日期不存在午夜

2017年12月,巴西政府更改了夏令时规则,以便夏季时间从11月的第一个星期日开始。有关参考资料,请参阅this page in Portuguesethis page in English

因此,虽然2018年的夏季时间实际于11月4日开始,但看起来您的JVM认为它始于10月21日。如果是这种情况,那么上午12点将不存在,所以凌晨1点将显示为该日期的开始。您还没有告诉我们您在Date对象中有什么价值,但我希望这是问题所在。

首先,如果可能的话,我会停止使用java.util.Date。在很多方面,java.time类型很多更好。如果你卡在旧版本的Java上,请使用JSR-310 backport

其次,更新您的时区数据。有关详细信息,请参阅this page

第三,找出你想要如何处理DST转换的方法。除了a)明确地考虑它之外,我们可能不会给出很多建议。 b)写很多测试。您需要做的具体细节取决于您的业务规则。 (根据我的经验,决定这些商业规则的人可能也没有考虑过这个问题。不要让他们把它挥手:要求精确的规格。当然,礼貌地说: )

答案 1 :(得分:0)

而不是试图减去小时数而不是直接设置为午夜更容易吗?

Calendar cal = Calendar.getInstance();
cal.setTime(data);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

return(new Date(cal.getTime().getTime()));

答案 2 :(得分:0)

在巴西开始夏令时(horáriodeverão)的那一天,时钟从00:00到01:00向前移动1小时。这意味着没有00:00的时间,它不存在。所以我很抱歉,你不能拥有它。

答案 3 :(得分:0)

  1. 首先:您的日期是否适合BRST更改?互联网声称它是 2018年11月4日

  2. 中学:您改为夏令时的一天中的一天 仅持续 23h ,因此,出于结算目的,您必须重新考虑如何按小时计算结算方式。