我希望其他人会回答。这是我的理解:
这里有两个概念:
- 任何一方都有 DTEND 并正在计算 DURATION,正如您所确定的,如果活动期间有夏令时更改,则 DURATION 会有所不同,或者
- 一个有持续时间并且正在计算DTEND。为了安全起见,最好在 UTC 中执行此操作。
请回答您的问题:
但是,如果开始日期/时间恰好是不连续时期之前的名义上的一天怎么办?在这种情况下,该持续时间结束时计算的本地时间应该是多少?
为了计算 DTEND,标称天同时将我们带到无效时间。如果一个人使用 UTC 来计算那个名义上的日子,一个人会得到 3.30 am。规范说:
在时间尺度不连续的情况下,比如变化
从标准时间到白天时间并返回,计算
确切的持续时间需要减去或增加的变化
不连续的持续时间。
我理解这意味着是的,正如您所指出的,当计算出计算的持续时间(即您有 DTSTART 和 DTEND 的位置)将根据日历中的事件点而有所不同。
请回答您的问题
但该中间结果是被跳过的无效标称时间,则该中间值的本地时间为 2020-03-08T03:30(凌晨 3:30,而不是凌晨 2:30...."
是的,但是在进一步计算时,我认为您将 12H 添加到本地时间时出错了。规范说使用较早的 UTC 偏移量,我的意思是使用它来获取 UTC 时间,使用 UTC 进行计算,然后转换回来。
如果描述的当地时间没有出现(当从
标准到白天时间),日期时间值使用解释
当地时间时差之前的 UTC 偏移量。
请注意,这是 UTC 偏移量。因此,名义上的一天将我们带到 3 月 8 日洛杉矶不“存在”的凌晨 2.30,因此我们使用时间间隔之前的 UTC 偏移量。 -8 小时,这给了我们 UTC=10h30。
加上 12H 给我们 UTC 22H30。
如果我们保留 -8 偏移量进行计算,我们将得到当地时间 14:30。
*规范中没有 100% 说明就是这样。更多工作示例来确认会很好。
我在其他地方看到的建议是以 UTC 时间存储时间,以 UTC 时间进行计算,然后为了显示,计算本地时间。*
回复:
是 2020-03-08T14:30 吗?
这是根据 RFC 5455 的“正确”答案吗?如果不是,答案应该是什么?为什么?
我知道是 14H30。我使用 PHP 进行了交叉检查,并在 DST 之前和 DST 期间在洛杉矶和 UTC 时间进行了计算,同时使用了 datetime->add https://www.php.net/manual/en/datetime.add.php 和 https://www.php.net/manual/en/datetime.modify.php 并始终得到该答案。
我认为正确的是 2020-03-08T14:30,因为如果使用指定的 UTC 偏移量并以 UTC 计算,那就是得到的。
PHP 工作原理
add a nominal day P01D
Before DST:
2020-03-06T02:30:00-08:00
2020-03-07T02:30:00-08:00 with modify
2020-03-07T02:30:00-08:00 add date interval
Over DST:
2020-03-07T02:30:00-08:00
2020-03-08T03:30:00-07:00 with modify
2020-03-08T03:30:00-07:00 add date interval
add a nominal day plus 12 H ie: P01DT12H
Before DST:
2020-03-06T02:30:00-08:00
2020-03-07T14:30:00-08:00 add date interval
Over DST:
2020-03-07T02:30:00-08:00
2020-03-08T14:30:00-07:00 with modify
2020-03-08T14:30:00-07:00 add date interval
检查偏移量:https://www.timeanddate.com/worldclock/meetingtime.html?day=8&month=3&year=2020&p1=137&iv=0