Почему метод inDaylightTime () возвращает неправильный часовой пояс? - PullRequest
1 голос
/ 13 марта 2019

Моя первая печать показывает, что переход на летнее время начинается с 8 марта, тогда как для проверки того, что я передал свою пользовательскую дату (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);

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Летнее время не действовало в восточной зоне США 9 марта 2019 года. Оно вступило в силу 10 марта в 2 часа ночи См. Timeanddate.com .

MyПервая печать показывает, что летнее время начинается с 8 марта ...

Я предполагаю, что вы основываетесь на этом:

startMode = 3, startMonth = 2, startDay = 8, startDayOfWeek = 1, startTime = 7200000

Помните, что изменения летнего времени (по крайней мере в США) всегда происходят рано утром в воскресенье.Это правило говорит о том, что первое воскресенье 8 марта или после него - это когда должно произойти изменение, а не то, что оно должно произойти 8 марта (это была пятница).Закон гласит, что оно начинается во второе воскресенье марта (в настоящее время оно периодически меняется), поэтому, говоря, что в первое воскресенье 8 марта или после этой даты код соответствует определению «второе воскресенье марта».

Вы можете увидеть эту концепцию в описании SimpleTimeZone:

Чтобы создать SimpleTimeZone с расписанием перехода на летнее время, расписание можно описать с помощью набора правил:начальное правило и конечное правило.День, когда летнее время начинается или заканчивается, определяется сочетанием значений месяца, дня месяца и дня недели.Значение месяца представлено значением поля Calendar MONTH, например Calendar.MARCH.Значение дня недели представлено значением календаря DAY_OF_WEEK, например, SUNDAY.Значения комбинаций значений следующие:

  • Точный день месяца Чтобы указать точный день месяца, задайте точное значение месяца и дня месяца,и день недели до нуля.Например, чтобы указать 1 марта, установите для месяца значение МАРТ, для дня месяца - 1, а для дня недели - 0.
  • День недели в или после дня месяца Чтобы указать день недели в или после точного дня месяца, задайте для месяца точное значение месяца, от дня месяца до дня, после которого применяется правило, и от дня недели доотрицательное значение поля DAY_OF_WEEK.Например, чтобы указать второе воскресенье апреля, установите для месяца значение АПРЕЛЬ, для дня месяца - 8, а для дня недели - -Воскресенье.
  • День недели в или до днямесяца Чтобы указать день недели или раньше точного дня месяца, установите для дня месяца и дня недели отрицательное значение.Например, чтобы указать последнюю среду 21 марта или ранее, задайте для месяца значение МАРТ, для дня месяца - 21, а для дня недели - СРЕДА.
  • Последний день-of-недели месяца Чтобы указать, в последний день недели месяца, установите для дня недели значение DAY_OF_WEEK, а для дня месяца - -1.Например, чтобы указать последнее воскресенье октября, установите для месяца значение OCTOBER, для дня недели - SUNDAY, а для дня месяца - -1.
1 голос
/ 14 марта 2019

Не могли бы вы опубликовать небольшой пример, используя эти 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) началось в прошлое воскресенье, 10 марта, в Северной Америке в этом году.Итак, давайте попробуем с этим днем ​​в 5 утра - тогда мы должны получить true.

    ZonedDateTime testTime = ZonedDateTime.of(2019, 3, 10, 5, 0, 0, 0, zone);

Является ли день в летнее время истинным

zone.getRules() возвратZoneRules объект.Такой объект знает все о смещении UTC для часового пояса, а также о летнем времени.Таким образом, мы можем запросить его с Instant.Мы получаем Instant из testTime.toInstant().

Ссылка: Раздел Часовой пояс и офсетные классы в руководстве по Oracle (включая пример использования ZoneRulesэто немного напоминает мое).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...