1

我正在尝试运行以下代码。我用 dst 从 3 月 4 日凌晨 2 点开始定义一个时区,并在 3 月 2 日凌晨 5 日结束。

  SimpleTimeZone st = new SimpleTimeZone(-18000000, "DSTTesting", Calendar.MARCH, 4, 1, 7200000, Calendar.MARCH, -1, 1, 7200000);

  Calendar cal = Calendar.getInstance(st);
  cal.set(2013, 0, 1, 0, 0, 0);
  cal.set(Calendar.MILLISECOND, 0);
  System.out.println("DST_OFFSET before subtracting hours : "+cal.get(Calendar.DST_OFFSET));
  cal.add(Calendar.HOUR, -2);
  System.out.println("DST_OFFSET after subtracting hours : "+cal.get(Calendar.DST_OFFSET));

输出为:
减去小时前的 DST_OFFSET :0
减去小时后的 DST_OFFSET :3600000

当我从 2013 年 1 月凌晨 1 点减去 2 小时时,不确定为什么 DST_OFFSET 会发生变化。理想情况下,2013 年 1 月 1 日和 2012 年 12 月 31 日,这两个日期都不在我创建的 TimeZone 的 DST 期间,因此两者的 DST_OFFSET 值应该相同。

4

1 回答 1

1

我认为您有一些无效的构造函数参数。请参阅此处的文档。

您正在指定以下起始值:

Calendar.MARCH, 4, 1

如果您的意思是“3 月 4 日”,那么您应该为星期几指定零:

Calendar.MARCH, 4, 0

如果您的意思是“3 月 4 日或之后的第一个星期日”,那么您应该指定一个负的星期几值:

Calendar.MARCH, 4, -1

您指定的结束日期看起来没问题。它是:

Calendar.MARCH, -1, 1

这意味着“三月的最后一个星期日”。

我不确定为什么 DST 会因此而关闭,但请尝试纠正它,看看它是否有所作为。

另外 - 你应该认真考虑Joda Time库而不是这个。您将获得更可靠的结果,并且您不必自己实施所有 DST 规则。

更新

仔细阅读文档,不清楚cal.get(Calendar.DST_OFFSET)日历的当前日期是否生效,或者它是否只是返回与时区相关的日光偏移量。它的措辞如下:

如果 TimeZone 实现子类支持历史夏令时时间表更改,则此字段反映此日历的时区的正确夏令时偏移值

也许你应该试试这个?

boolean dst = st.inDaylightTime(cal.getTime());

我只是在这里猜测。我自己没有测试过。

于 2013-04-12T14:28:55.490 回答