Java DST_偏移量在不应更改时发生更改

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,

我试图运行下面的代码。我定义了一个时区,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_偏移量: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