我在单独的循环迭代中生成两组重复事件,但在比较生成的冲突结果时发生冲突。这似乎是时代倒退的时候,我不确定如何解决这个问题?
第一个重复事件将:
- 在"欧洲/斯德哥尔摩"时间每天00:00至01:00重复
- 自2015年11月3日起
- 循环直到永远
第二个重复事件将:
- 在"欧洲/斯德哥尔摩"时间每天01:00至02:00重复
- 自2015年11月3日起
- 再次永远循环
为了生成我每天在当地时区"欧洲/斯德哥尔摩"使用Nodatime循环的事件,如下所示:
String timeZone = "Europe/Stockholm";
for (ZonedDateTime date_Local = repeatSeriesStartDate_Local; date_Local <= LoopEndDate_Local; date_Local = new ZonedDateTime(Instant.FromDateTimeUtc(date_Local.ToDateTimeUtc().AddDays(1).ToUniversalTime()),timeZone))
我的问题出现在2016年10月29日/30日,当时时钟倒退,第二条规则与第一条规则冲突。http://www.timeanddate.com/time/change/sweden/stockholm?year=2016
冲突时间如下:
- "2016-10-29T23:00:00Z"至"2016-10-30T01:00"
- "2016-10-30T00:00Z"到"2016-10-300T01:000Z"
我正在使用像这样的算法来测试冲突https://stackoverflow.com/a/325964/884132
我应该如何处理这些时移冲突?
虽然如果你能澄清这个问题会很有帮助,但我现在会做一些假设。如果有必要,我可以稍后编辑这个问题。
你可能想做的是这样的事情:
for (LocalDate date = startDate; date <= endDate; date = date.PlusDays(1))
{
ZonedDateTime zdt = date.At(eventTime).InZone(tz, SchedulingResolver);
Console.WriteLine(zdt); // or whatever you want to do from here
}
SchedulingResolver
实现就在这里,并且只有在使用1.x版本的Noda Time时才有必要。如果您使用的是2.x,那么您可以只使用InZoneLeniently(tz)
,因为2.x中宽松解析器的行为已更改为匹配(请参阅2.x迁移指南中的"宽松解析器更改")。
关键点是:
CCD_ 3通常最好用作中间类型。
您有基于当地日期的日常活动,因此
LocalDate
更合适。如果您的活动是基于固定的24小时轮换(也就是UTC日),那么
Instant
会更合适。
解析程序用于将不明确或无效的
LocalDateTime
值映射回特定时刻。我建议用于调度目的的解析器是:- 时钟前进(春季)时,通过夏令时偏置提前(通常为1小时)
- 时钟倒转(下降)时拾取第一个实例
尽管正如Jon所提到的,您的需求可能会有所不同,但我们确实无法回答您应该做什么。确实有一些业务需要与我推荐的不同的解析器规则。