我正在尝试运行以下代码。我定义了一个时区,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值。
答案 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());
我只是在这里猜测。我自己没有测试过。