java - BiWeekly 迭代夏令时变化
问题描述
我正在尝试使用 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);
如果我将 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
对此进行迭代,当时间越过夏令时边界时,时间会改变一个小时。
应该如何做才能使事件在给定时间发生?(它在UTC同时发生是正确的,但我希望它在本地同时发生。)
解决方案
由于某种原因,dtstartTimezone
即使DTSTART
事件中存在时区,上面代码中的返回 null 也是如此。(这可能是另一个需要追踪的问题。)
因为这是空的,所以迭代器正在获取 UTC 时区,因此迭代的日期是基于 UTC 的,并且在跨越目标时区的夏令时边界时会发生变化。
删除将时区从日历中提取出来的时区分配代码并将其替换为val timezone = TimeZone.getTimeZone("Pacific/Auckland")
(或正确的时区)并在迭代器中使用它可以解决此问题。
推荐阅读
- c# - Docker compose 不拾取环境变量
- python - 分段错误:11 - tkinter python
- java - 使用 Scanner 类将字符串值输入字符串数组
- git - 在 /usr/share/perl5/core_perl/Net/SMTP.pm 第 270 行安装版本>=2.007 的 IO::Socket::SSL,
3号线 - java - Android Studio (Java):在 TextView 上设置时间
- android - android butterknife 没有显示 Generate butterknife generate injections in Android Studio4.1.2
- c++ - A-Star 搜索算法找不到有效路径
- laravel - 从 GMT 时间获取当地时间的偏移时间 - Laravel Carbon
- python - AttributeError: 'list' object has no attribute 'text' 在 DOM 中查找元素时出错
- git - 为什么 pgp 签名直接附加到标头而不是将它们存储在 blob 中并引用它们?