gpt4 book ai didi

c# - 将来时区倒退时如何处理

转载 作者:太空狗 更新时间:2023-10-29 19:45:08 25 4
gpt4 key购买 nike

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

第一个重复事件将:

  • 在“欧洲/斯德哥尔摩”时间的每天 00:00 到 01:00 重复
  • 自 2015 年 3 月 11 日起
  • 循环直到永远。

第二个重复事件将:

  • 在“欧洲/斯德哥尔摩”时间的每天 01:00 到 02:00 重复
  • 自 2015 年 3 月 11 日起
  • 再次无限循环。

要使用 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:00Z”
  • “2016-10-30T00:00:00Z”到“2016-10-30T01:00:00Z”

我正在使用像这样的算法来测试冲突 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 实现是 here ,只有在使用 Noda Time 的 1.x 版本时才需要。如果您使用的是 2.x,那么您可以只使用 InZoneLeniently(tz),因为 2.x 中的宽松解析器的行为已更改为匹配(请参阅 the 2.x migration guide 中的“宽松解析器更改” ).

关键点是:

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

    • 您有基于本地日期的每日事件,因此 LocalDate 更合适。

    • 如果您的事件基于固定的 24 小时轮换(也称为 UTC 日),那么 Instant 会更合适。

  • 解析器用于将不明确或无效的 LocalDateTime 值及时映射回特定时刻。我推荐用于调度目的的解析器是:

    • 当时钟向前( Spring )时,DST 偏差(通常为 1 小时)提前
    • 在时钟倒退(下降)时选择第一个实例

虽然正如 Jon 提到的那样 - 您的需求可能会有所不同,但实际上我们无法回答您应该做什么。确实有一些业务需要与我推荐的不同的解析器规则。

关于c# - 将来时区倒退时如何处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33502878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com