我的第一个打印显示夏令时从3月8日开始,而检查我已经将我的自定义日期(3月9日)传递给timeZone.inDaylightTime(calendar.getTime()),而它返回false.Where我出错了?
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);
DST于2019年3月9日在美国东部地区没有生效。它于3月10日凌晨2点在See timeanddate.com生效。
我的第一张照片显示夏令时从3月8日开始......
我猜你是基于这个:
startMode = 3,startMonth = 2,startDay = 8,startDayOfWeek = 1,startTime = 7200000
请记住,DST的变化(至少在美国)总是在星期天早上发生。该规则所说的是,3月8日或之后的第一个星期日是变更发生的时间,而不是3月8日(星期五)。法律规定它从3月的第二个星期日开始(此刻,它会定期变化),因此在3月8日或之后的第一个星期日,该代码符合“3月的第二个星期日”的定义。
你可以在SimpleTimeZone
的描述中看到这个概念:
要构建具有夏令时计划的SimpleTimeZone,可以使用一组规则,start-rule和end-rule来描述计划。夏令时开始或结束的日期由月份,日期和星期值的组合指定。月份值由Calendar MONTH字段值表示,例如Calendar.MARCH。星期几值由Calendar DAY_OF_WEEK值表示,例如SUNDAY。价值组合的含义如下。
- 确切的某一天要指定一个月的确切日期,请将月份和日期设置为精确值,将星期几设置为零。例如,要指定3月1日,请将月份设置为MARCH,将日期设置为1,将星期几设置为0。
- 星期几或星期几之后的星期几指定星期几或之后的星期几,将月份设置为确切的月份值,将日期设置为应用规则的日期或之后的日期,和星期几到负DAY_OF_WEEK字段值。例如,要指定4月的第二个星期日,请将月份设置为APRIL,将月份设置为8,将星期几设置为-SUNDAY。
- 星期几或星期几之前的星期若要指定当月或之前的星期几,请将星期几和星期几设置为负值。例如,要指定3月21日或之前的最后一个星期三,请将月份设置为MARCH,将星期日设置为-21,将星期几设置为-WEDNESDAY。
- 月份的最后一天要指定月份的最后一天,请将星期几设置为DAY_OF_WEEK值,将日期设置为-1。例如,要指定10月的最后一个星期日,请将月份设置为OCTOBER,将星期几设置为SUNDAY,将星期几设置为-1。
你可以通过使用ZoneId和ZonedDateTime来发布一个小例子,以获得dayLightSaving日期
这将是我的荣幸。
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。所以我们可以用Instant
查询它。我们从Instant
得到一个testTime.toInstant()
。
链接:Oracle教程中的Time Zone and Offset Classes部分(包括使用ZoneRules
的一个例子,有点像我的)。