Java Calendar DST推进问题/错误

时间:2015-03-09 15:32:54

标签: java calendar dst

如果我的日期是2015-03-07 02:00:00 -0500并且我加1天(时间从2 - > 3月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天并将其转换回来时的行为相同,因为预期从凌晨2点开始凌晨3点才真正变为凌晨3点。同时使用基于GMT的日历会产生:

在添加1天之前:2015-03-07 02:00:00 -0500

在加入1天之前GMT cal: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));

1 个答案:

答案 0 :(得分:1)

对于那些实现DST的时区,本地时间2015-03-07 02:00:00 -0500在技术上不存在。在这些情况下,我猜测结果是不确定的。可以肯定的是,您可以使用2015-03-07 01:59:59 -05002015-03-07 03:00:00 -0500进行测试,这样可以提供正确的结果,或者至少不会对DST转换产生错误。

但是,如果例如内部代码增加86400秒,那么在这种情况下丢失一小时是有意义的。