Java 为什么inDaylightTime()方法在时区中返回错误?
我的第一次打印显示夏时制从3月8日开始,而检查我是否已将自定义日期(3月9日)传递到timeZone.inDaylightTime(calendar.getTime()),但返回false。我哪里出错了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
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 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或任何链接?