我正在寻找一个深刻的解释,到底TZOFFSETFROM和TZOFFSETTO在iCalendar描述之间的区别是什么,以及如何计算它。
虽然这里有描述:https://www.rfc-editor.org/rfc/rfc5545#section-3.6.5[第65页]我无法理解它的含义,特别是如何计算它。我有一个所有时区及其相关的UTC_offset_StandardTime和UTC_offset_DaylightSavingTime的列表,但是没有" onset " time。
虽然有一个答案https://stackoverflow.com/a/3872214我找不到一个资源证明这是正确的。
我错过了什么?
Re: "如何计算时区偏移";
它不是'计算',而是查找-大多数系统使用Olson时区数据库内置了此信息,并保持(希望)最新。系统或语言通常有一个函数来获取给定日期和时间的偏移量。如:
- 在php https://www.php.net/manual/en/datetime.getoffset.php。或者可以将所有转换输出到VTIMEZONE https://www.php.net/manual/en/datetimezone.gettransitions.php
- 总评https://en.wikipedia.org/wiki/Time_zone#Computer_systems
大多数系统都维护这样的数据库。通常有一个反复出现的规则,总是如此,但是国家和地区可能会改变夏令时的日期。参见https://en.wikipedia.org/wiki/Daylight_saving_time_in_Australia#Western_Australia和奥运会的变化。这将意味着为这些区域提供一组额外的VTIMEZONE DST转换定义,在任何重复出现的规则上使用dtstart和UNTIL来指示它们在哪些年份适用或不适用。
现在,.ics规范要求我们必须包括这些时区转换-在文件中的VTIMEZONE定义中的夏令时更改。
这就引出了你的另一个问题:
RE:什么是TZOFFSETFROM和TZOFFSETTO?
它们是由RRULE生成的每个转换日期(或者只是一个日期,如果不是重复的,如果是一次性的),相对于UTC或GMT:
- FROM
- 的偏移到
以3月14日的纽约2021夏令时间为例。时区偏移量为-5。在2021年3月14日凌晨2点之后,时区偏移量将为-4。参见https://www.timeanddate.com/time/zone/usa/new-york-state。
那么如果我们看一下google日历的输出,我们看到在三月的第二个星期日凌晨2点,夏令时开始,NY变为
- 与-05年,
- -04年。
那么当他们在11月的第一个星期日恢复到标准时间时,NY变为
- 与-04和 的偏移量
注意(FROM和TO偏移量)都是必需的,因为变化并不总是一个小时。有时变化可能需要30分钟。请参阅https://www.timeanddate.com/time/time-zones-interesting.html并在底部附近向下滚动。你会看到豪勋爵岛(Lord Howe Island)发生了半小时的变化,而朝鲜在2015年和委内瑞拉在2016年发生了"历史性的半小时偏移"。
谷歌日历纽约示例:
BEGIN:VTIMEZONE
TZID:America/New_York
X-LIC-LOCATION:America/New_York
BEGIN:DAYLIGHT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE