我的第一张照片显示夏令时从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);

最佳答案

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,可以使用一组规则(开始规则和结束规则)来描述该时间表。夏令时开始或结束的日期由月,月日和星期几的组合指定。月值由Calendar MONTH字段值表示,例如Calendar.MARCH。星期几的值由日历的DAY_OF_WEEK值表示,例如SUNDAY。值组合的含义如下。
  
  
  确切的月份
  要指定确切的月份,请将月份和每月的日期设置为准确的值,并将每周的日期设置为零。例如,要指定3月1日,请将月份设置为MARCH,将每月的日期设置为1,将每周的日期设置为0。
  星期几或当月的某天之后
  要指定一个星期的确切日期或之后的星期几,请将月份设置为确切的月份值,将每月的日期设置为应用规则的当天或之后的日期,将星期几设置为负数DAY_OF_WEEK字段值。例如,要指定四月的第二个星期日,请将月份设置为APRIL,将每月的日期设置为8,将每周的日期设置为-SUNDAY。
  星期几或每月的某天之前
  要指定一个月中的确切日期或之前的星期几,请将月中的某天和一周中的某天设置为负值。例如,要指定3月21日或之前的最后一个星期三,请将月份设置为MARCH,每月的日期为-21,每周的日期为-WEDNESDAY。
  一个月的最后一周
  要指定该月的最后一个星期几,请将星期几设置为DAY_OF_WEEK值,并将星期几设置为-1。例如,要指定十月的最后一个星期日,请将月份设置为OCTOBER,将周几设置为SUNDAY,将周几设置为-1。

关于java - 为什么inDaylightTime()方法在时区返回错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55139831/

10-10 13:59