NodaDST发生时的时间添加

本文关键字:时间 添加 NodaDST | 更新日期: 2023-09-27 18:28:19

假设我有日期2014-11-2T00:00:00-0600,然后我想添加1天,并且有2014-11-3T00:00:00-0700。

现在,如果我这样做:

crtDay.Plus(Duration.FromStandardDays(1));

crtDay是ZonedDateTime对象

我的结局是:2014-11-2T23:00:00-0700。

我该如何转移到第二天?(我可以增加几个小时直到第二天,但感觉必须有更好的方法。)

谢谢。

NodaDST发生时的时间添加

(根据您给出的值,我假设您在美国山区时区工作。)

"标准日"是24小时。但是,在您提到的那一天,日历日中有25个小时,因为夏令时回退转换会重复01:00到02:00的时间。因此,如果你只增加24小时,你就会在同一天结束。

在Noda Time中,ZonedDateTime结构表示相对于时区的特定时刻。因此,您只能使用Duration移动线性瞬时时间。

要按日历时间移动,您必须获取它的LocalDateTime并添加一个Period。如果需要,您可以根据结果创建一个新的ZonedDateTime

ZonedDateTime nextDay = zdt.LocalDateTime.PlusDays(1).InZoneLeniently(zdt.Zone);

这里我使用InZoneLeniently是为了方便。但是,您应该了解该特定解析器的行为。根据您的需要,不同的解析器(或自定义解析器)可能更合适。

举个例子,假设你是从当天1点30分开始上班的。宽大的解析器会假设您想要选择两次事件中的后一次。从本质上讲,即使24小时仍然会产生相同的时钟时间,你也会增加25小时。也许您的用户可能希望您在第一次出现时登录。

还要考虑春季前向过渡,如果你在2:30开始,那么你会在不存在的日期/时间着陆。宽松的解析器将前进到时区的下一个有效时钟时间-可能是可以接受的,但它将有一个不同的时钟时间2:00。您的用户可能希望您提前整整一个小时,而不是下一个有效的时钟时间。

Noda Time v2正在重新考虑内置解析器。见第295期,以及本备选实施方案。