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。
我该如何转移到第二天?(我可以增加几个小时直到第二天,但感觉必须有更好的方法。)
谢谢。
(根据您给出的值,我假设您在美国山区时区工作。)
"标准日"是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期,以及本备选实施方案。