如何处理未来时区倒退的情况

时间:2015-11-03 15:25:54

标签: c# datetime timezone globalization nodatime

我在单独的循环迭代中生成两组重复事件,但在比较生成的冲突结果时发生冲突。这似乎是时候倒退,我不确定如何解决这个问题?

第一个重复事件将:

  • 每天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

冲突时间如下:

  • &#34; 2016-10-29T23:00:00Z&#34;到&#34; 2016-10-30T01:00:00Z&#34;
  • &#34; 2016-10-30T00:00:00Z&#34;到&#34; 2016-10-30T01:00:00Z&#34;

我正在使用像这样的算法来测试冲突 https://stackoverflow.com/a/325964/884132

我该如何处理这些时间转换冲突?

1 个答案:

答案 0 :(得分:2)

虽然如果你澄清这个问题会有所帮助,但我现在做了一些假设。如有必要,我可以稍后编辑问题。

你可能想要做的是这样的事情:

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实施是here,只有在使用1.00版本的Noda Time时才有必要。如果您使用的是2.x,那么您可以使用InZoneLeniently(tz)代替,因为2.x中宽松解析器的行为已更改为匹配(请参阅&#34;宽松解析器更改&#34;在{{ 3}})。

关键点是:

  • ZonedDateTime通常最适合用作中间类型。

    • 您有每日基于当地日期的活动,因此LocalDate更合适。

    • 如果您的活动基于固定的24小时轮换(也就是UTC日),那么Instant会更合适。

  • 解析器用于将模糊或无效的LocalDateTime值映射回特定时刻。我建议用于调度目的的解析器是:

    • 当时钟前进(春天)时,DST偏差(通常为1小时)的进展
    • 当时钟返回(下降)时挑选第一个实例

虽然Jon提到 - 您的需求可能会有所不同,但实际上我们无法回答您应该做的事情。事实上,企业需要不同于我推荐的解决方案规则。