从可变日期(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
答案 0 :(得分:2)
这里有两个问题:
2017年12月,巴西政府更改了夏令时规则,以便夏季时间从11月的第一个星期日开始。有关参考资料,请参阅this page in Portuguese或this 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)
首先:您的日期是否适合BRST更改?互联网声称它是 2018年11月4日。
中学:您改为夏令时的一天中的一天 仅持续 23h ,因此,出于结算目的,您必须重新考虑如何按小时计算结算方式。