Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么inDaylightTime()方法在时区中返回错误?_Java_Timezone_Dst - Fatal编程技术网

Java 为什么inDaylightTime()方法在时区中返回错误?

Java 为什么inDaylightTime()方法在时区中返回错误?,java,timezone,dst,Java,Timezone,Dst,我的第一次打印显示夏时制从3月8日开始,而检查我是否已将自定义日期(3月9日)传递到timeZone.inDaylightTime(calendar.getTime()),但返回false。我哪里出错了 TimeZone timeZone = TimeZone.getTimeZone("US/Eastern"); System.out.println("TimeZone ::: "+timeZone); Calendar calendar = Calendar.getI

我的第一次打印显示夏时制从3月8日开始,而检查我是否已将自定义日期(3月9日)传递到timeZone.inDaylightTime(calendar.getTime()),但返回false。我哪里出错了

    TimeZone timeZone = TimeZone.getTimeZone("US/Eastern");
    System.out.println("TimeZone ::: "+timeZone);

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.AM_PM, Calendar.AM);
    calendar.set(Calendar.MONTH, Calendar.MARCH);
    calendar.set(Calendar.DAY_OF_MONTH, 9);
    calendar.set(Calendar.YEAR,2019);

    boolean b = timeZone.inDaylightTime(calendar.getTime());
    System.out.println("Is the day in daylight saving "+b);

2019年3月9日,DST在美国东部地区无效。它于3月10日凌晨2点生效

我的第一张照片显示夏时制从3月8日开始

我猜你是基于这个:

startMode=3, startMonth=2, startDay=8, startDayOfWeek=1, 起始时间=7200000

请记住,DST更改(至少在美国)总是在星期天早上很早发生。这条规则说的是,3月8日或之后的第一个星期日是变化发生的时间,而不是3月8日(即星期五)。法律规定它从3月的第二个星期日开始(目前,它是周期性变化的),所以说第一个星期日是在3月8日或之后,法典符合“3月的第二个星期日”的定义

您可以在以下内容的描述中看到此概念:

要构造具有夏令时时间表的SimpleTimeZone,可以使用一组规则、开始规则和结束规则来描述该时间表。夏令时开始或结束的日期由月、月日和周日值的组合指定。月值由日历月字段值表示,例如Calendar.MARCH。“周中日期”值由“周中日历日”值表示,如“星期日”。价值组合的含义如下

  • 月份的确切日期 要指定确切的月份天数,请将月份和月份天数设置为确切值,将星期几设置为零。例如,要指定3月1日,请将月份设置为3月,将月日设置为1,将周日设置为0
  • 一周中的某一天在某个月的某一天当天或之后 若要在某个月的某一天或该天之后指定一周中的某一天,请将“月”设置为“月”值,将“月”设置为应用规则的当天或之后,将“周”设置为“周中的某一天”字段值的负值。例如,要指定4月的第二个星期日,请将月设置为4月,将月日设置为8,将周日设置为-星期日
  • 月日当天或之前的星期日 要在某个月的某一天当天或之前指定一周中的某一天,请将“月的某一天”和“周的某一天”设置为负值。例如,要指定3月21日当天或之前的最后一个星期三,请将月设置为3月,月日为-21,星期日为-周三
  • 每月一周的最后一天 要指定月份的最后一周,请将“周中的一天”设置为“周中的一天”值,并将“月中的一天”设置为-1。例如,要指定10月的最后一个星期日,请将月设置为10月,将星期几设置为星期日,将月日设置为-1
你能用这些ZoneId和 获取日光保存日期的ZoneDateTime已存在

这将是我的荣幸

    ZoneId zone = ZoneId.of("America/New_York");
    ZonedDateTime testTime = ZonedDateTime.of(2019, 3, 9, 0, 0, 0, 0, zone);

    boolean dst = zone.getRules().isDaylightSavings(testTime.toInstant());
    System.out.println("Is the day in daylight saving " + dst);
夏令时的日子是假的吗

如另一个答案所述,今年北美的夏季时间(DST)从上周日3月10日开始。因此,让我们尝试在那天早上5点进行测试-然后我们应该得到
true

    ZonedDateTime testTime = ZonedDateTime.of(2019, 3, 10, 5, 0, 0, 0, zone);
夏令时的这一天是真的吗

zone.getRules()
返回一个
ZoneRules
对象。这样的对象知道时区的UTC偏移量以及DST的所有信息。因此,我们可以使用
即时查询
。我们从
testTime.toInstant()
中获得一个
即时


链接:Oracle教程中的一节(包括使用类似于我的
ZoneRules
的示例)。

嗨,Crowder,感谢您的详细解释,但我无法按照您的指定将一周中的一天设置为-周日。如calendar.set(calendar.DAY\u OF_WEEK,SUNDAY)@srinivas-您误读了上面的JavaDoc。在构造
SimpleTimeZone
时,可以使用
-SUNDAY
来告诉它使用该模式。答案的要点是:代码没有给出错误的答案,
false
对于您在美国东部时区指定的日期是正确的。:)明白了,谢谢Crowder。我建议您不要使用
日历
时区
。这些课程设计拙劣,早已过时。而是使用
ZoneId
zoneDateTime
,这两种方法都来自。另外,
US/Eastern
是该时区不推荐使用的名称,更喜欢
America/New_York
@Ole,请您使用这些ZoneId和ZonedDateTime发布一个小示例,以获取DaylightSave date exists或任何链接?