DST_OFFSET不应该更改

时间:2013-04-12 11:53:39

标签: java datetime timezone

我正在尝试运行以下代码。我定义了一个时区,dst从3月2日凌晨4点开始,到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值。

1 个答案:

答案 0 :(得分:1)

我认为你有一些无效的构造函数参数。请参阅文档here

您指定的起始值为:

Calendar.MARCH, 4, 1

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

Calendar.MARCH, 4, 0

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

Calendar.MARCH, 4, -1

您指定的结束日期看起来不错。那是:

Calendar.MARCH, -1, 1

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

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

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

<强>更新

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

  

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

也许你应该试试这个呢?

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

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