Java DST_偏移量在不应更改时发生更改
我试图运行下面的代码。我定义了一个时区,dst从3月2日上午第4个星期日开始,到3月2日上午第5个星期日结束Java DST_偏移量在不应更改时发生更改,java,datetime,timezone,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,
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_偏移量:0
减去小时后的DST_偏移量:3600000
不知道为什么DST_偏移量在我从2013年1月1日上午减去2小时后会发生变化。理想情况下,2013年1月1日和2012年12月31日,这两个日期都超出了我创建的时区的DST时段,因此这两个日期的DST_OFFSET值应该相同。我认为您有一些无效的构造函数参数。请参阅文档 您正在指定以下项的起始值:
Calendar.MARCH, 4, 1
如果您的意思是“三月四日”,那么您应该为“星期几”值指定一个零:
Calendar.MARCH, 4, 0
Calendar.MARCH, 4, -1
如果您的意思是“3月4日当天或之后的第一个星期日”,那么您应该指定一个负的星期日值:
Calendar.MARCH, 4, 0
Calendar.MARCH, 4, -1
您指定的结束日期看起来正常。它是:
Calendar.MARCH, -1, 1
这意味着“三月的最后一个星期日”
我不知道为什么DST会因为这个而关闭,但是试着纠正它,看看它是否有区别
<>也-你应该认真考虑图书馆而不是这个。您将获得更可靠的结果,并且您不必自己实现所有DST规则
更新
仔细阅读,不清楚cal.get(Calendar.DST_OFFSET)
是否使日历的当前日期生效,或者它是否只返回与时区关联的日光偏移。措辞如下:
此字段反映的是
如果时区实现子类
支持历史夏时制时间表更改
也许你应该试试这个
boolean dst = st.inDaylightTime(cal.getTime());
我只是在猜。我自己还没有测试过。我想你有一些无效的构造函数参数。请参阅文档 您正在指定以下项的起始值:
Calendar.MARCH, 4, 1
如果您的意思是“三月四日”,那么您应该为“星期几”值指定一个零:
Calendar.MARCH, 4, 0
Calendar.MARCH, 4, -1
如果您的意思是“3月4日当天或之后的第一个星期日”,那么您应该指定一个负的星期日值:
Calendar.MARCH, 4, 0
Calendar.MARCH, 4, -1
您指定的结束日期看起来正常。它是:
Calendar.MARCH, -1, 1
这意味着“三月的最后一个星期日”
我不知道为什么DST会因为这个而关闭,但是试着纠正它,看看它是否有区别
<>也-你应该认真考虑图书馆而不是这个。您将获得更可靠的结果,并且您不必自己实现所有DST规则
更新
仔细阅读,不清楚cal.get(Calendar.DST_OFFSET)
是否使日历的当前日期生效,或者它是否只返回与时区关联的日光偏移。措辞如下:
此字段反映的是
如果时区实现子类
支持历史夏时制时间表更改
也许你应该试试这个
boolean dst = st.inDaylightTime(cal.getTime());
我只是在猜。我自己还没有测试过。3月的第四个星期日应该写为日历。3月21日,-1但在做了此更改后,输出仍然相同。DST_偏移量在减去小时后从0变为3600000。请让我知道我在更新答案中发布的代码是否适用于您。Thank.trued boolean dst=st.inDaylightTime(cal.getTime());dst在减去小时数前计算为假,减去小时数后计算为真。我认为这与2012年的年份变化有关,只要我在2013年减去小时,DST_OFFSET的行为与预期一致。如果您将开始年份设置为较低的值,那么它是否有效?查看是否将开始年份更改为校准设置(2012,0,1,0,0,0);它使DST值保持不变。这意味着我创建的时区的dst持续时间仅适用于当前年份。输出为:减去小时前的dst_偏移量:减去小时后的3600000 dst_偏移量:3600000应将3月的第四个星期日写入日历。3月21日,-1但在进行此更改后,输出仍然相同。DST_偏移量在减去小时后从0变为3600000。请让我知道我在更新答案中发布的代码是否适用于您。Thank.trued boolean dst=st.inDaylightTime(cal.getTime());dst在减去小时数前计算为假,减去小时数后计算为真。我认为这与2012年的年份变化有关,只要我在2013年减去小时,DST_OFFSET的行为与预期一致。如果您将开始年份设置为较低的值,那么它是否有效?查看是否将开始年份更改为校准设置(2012,0,1,0,0,0);它使DST值保持不变。这意味着我创建的时区的dst持续时间仅适用于当前年份。输出为:减去小时前的dst_偏移量:3600000减去小时后的dst_偏移量:3600000