BiWeekly迭代夏令时更改

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

我正在尝试使用Java BiWeekly库在夏时制更改中迭代事件。

说事件在上午8点开始,我希望它保持在上午8点,而不考虑夏令时是否生效。

以下代码来自BiWeekly网站:https://github.com/mangstadt/biweekly/wiki/Examples#calculating-the-dates-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);

如果我有一个创建的天体:

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

反复进行此操作,时间越过夏时制边界,则变化一个小时。

如何保持在给定时间发生的事件? (正确的是它在UTC中同时发生,但是我希望它在本地同时发生。)

java icalendar biweekly
1个回答
0
投票

由于某种原因,即使事件的dtstartTimezone中存在时区,以上代码中的DTSTART仍返回null。 (这可能是另一个需要跟踪的问题。)

因为这是null,所以迭代器正在获取UTC时区,因此,迭代的日期是基于UTC的,并且在目标时区中越过夏时制边界时会更改。

[删除将时区从日历中拉出的时区分配代码,然后将其替换为val timezone = TimeZone.getTimeZone("Pacific/Auckland")(或正确的时区),并在迭代器中使用它可以解决此问题。

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