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

问题描述 投票:1回答:2

我的第一个打印显示夏令时从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);
java timezone dst
2个回答
2
投票

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。

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的一个例子,有点像我的)。

© www.soinside.com 2019 - 2024. All rights reserved.