Java 日历 DST 提前问题/错误

标签 java calendar dst

如果我的日期为 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 -05002015-03-07 03:00:00 -0500 进行测试,这应该给出正确的结果,或者至少不会与 DST 转换混淆。

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

关于Java 日历 DST 提前问题/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28945868/

相关文章:

mysql - 如何从日历数据库中获取可用时间段列表

QuickBooks Web 连接器 TimeModified 偏移量不考虑夏令时

java - 如何从build.gradle读取config.rpc.port的值到corda中的java类

javascript - 伊斯兰(回历)日历的 Javascript Intl.DateTimeFormat() 输出在 'islamic' 和 'ar-SA' 之间存在差异

java - 2个日历实例之间的差异给出不一致的答案

PHP UNIX 时间戳 int(10) DST

java - 如何检测android中的夏令时转换

java - 无法在对话框中显示 Spinner DropDown 列表

java - 私有(private)构造函数不影响 Dozer

java - 一会儿低音?