如果我的日期为 2015-03-07 02:00:00 -0500,并且我向其添加 1 天(时间从 3 月 8 日的 2 -> 3 更改),我会得到错误的值作为结果日历:
添加 1 天之前:2015-03-07 02:00:00 -0500
添加 1 天后:2015-03-08 01:00:00 -0500
通过执行以下代码行调整日期:
System.out.println("Before Adding 1 Day: " + getFormattedDate(cal));
cal.add(Calendar.DATE, 1);
System.out.println("After Adding 1 Day: " + getFormattedDate(cal));
当凌晨 2 点向前移动到凌晨 3 点时,日历如何以凌晨 1 点时间结束。
嗯,它的行为应该与您在 UTC 的同一时间日历中添加 1 天并将其转换回来一样,它总是按预期返回凌晨 3 点,因为凌晨 2 点实际上已经变成了凌晨 3 点。同时使用基于 GMT 的日历会产生:
添加 1 天校准之前:2015-03-07 02:00:00 -0500
添加 1 天 GMT 之前:2015-03-07 07:00:00 +0000
添加 1 天 GMT 校准后:2015-03-08 07:00:00 +0000
添加 1 天校准后:2015-03-08 03:00:00 -0400
Calendar gmtCal = Calendar.getInstance(UTC_TIMEZONE);
gmtCal.setTimeInMillis(calTime);
System.out.println("Before Adding 1 Day cal: " + getFormattedDate(cal));
System.out.println("Before Adding 1 Day GMT cal: " + getFormattedDate(gmtCal));
gmtCal.add(Calendar.DATE, 1);
cal.setTimeInMillis(gmtCal.getTimeInMillis());
System.out.println("After Adding 1 Day GMT cal: " + getFormattedDate(gmtCal));
System.out.println("After Adding 1 Day cal : " + getFormattedDate(cal));
最佳答案
对于那些实现 DST 的时区,本地时间 2015-03-07 02:00:00 -0500
从技术上讲并不存在。在这些情况下,我猜结果是不确定的。可以肯定的是,您可以使用 2015-03-07 01:59:59 -0500
和 2015-03-07 03:00:00 -0500
进行测试,这应该给出正确的结果,或者至少不会与 DST 转换混淆。
但在这种情况下,如果代码内部增加了 86400 秒,那么损失一小时是有意义的。
关于Java 日历 DST 提前问题/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28945868/