Раз в две недели перебираем изменения летнего времени - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь перебрать событие с переходом на летнее время с помощью библиотеки Java BiWeekly.

Скажем, событие начинается в 8 утра, я хочу, чтобы оно продолжалось в 8 часов утра, независимо от того, в какие дни идет летнее время. эффект или нет.

Следующий код взят с веб-сайта BiWeekly: https://github.com/mangstadt/biweekly/wiki/Examples#calculating -the-date-in-a-recurring-event

ICalendar ical = ...
TimezoneInfo tzinfo = ical.getTimezoneInfo();

VEvent event = ical.getEvents().get(0);
DateStart dtstart = event.getDateStart();

TimeZone timezone;
if (tzinfo.isFloating(dtstart)){
  timezone = TimeZone.getDefault();
} else {
  TimezoneAssignment dtstartTimezone = tzinfo.getTimezone(dtstart);
  timezone = (dtstartTimezone == null) ? TimeZone.getTimeZone("UTC") : dtstartTimezone.getTimeZone();
}
DateIterator it = event.getDateIterator(timezone);

Если У меня есть Celendar, созданный как:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Michael Angstadt//biweekly 0.6.3//EN
BEGIN:VEVENT
UID:deb01413-942a-4ea9-a53c-541493fa668a
DTSTAMP:20200213T051827Z
SUMMARY;LANGUAGE=en-us:Team Meeting
DTSTART;TZID=/Pacific/Auckland:20200213T181827
DURATION:PT1H
RRULE:FREQ=WEEKLY;INTERVAL=2
END:VEVENT
END:VCALENDAR

Итерируя по этому, время меняется на час, когда оно пересекает границу перехода на летнее время.

Как это сделать, чтобы сохранить происходящие события в данное время? (Это верно, что это происходит одновременно в UT C, но я хочу, чтобы это происходило в одно и то же время локально.)

1 Ответ

0 голосов
/ 14 февраля 2020

По какой-то причине dtstartTimezone в приведенном выше коде возвращает ноль, даже если в DTSTART события был часовой пояс. (Это может быть еще одна проблема для отслеживания.)

Поскольку это было нулевым, итератор получал часовой пояс UT C и, следовательно, итерированные даты основывались на UT C и менялись при пересечении границы перехода на летнее время в целевом часовом поясе.

Удаление кода назначения часового пояса, который вытащил часовой пояс из календаря, и замена его на val timezone = TimeZone.getTimeZone("Pacific/Auckland") (или правильный часовой пояс) и использование его в итераторе устраняет эту проблему.

...