【问题标题】:Date time convertion with daylight saving夏令时的日期时间转换
【发布时间】:2017-08-28 08:47:30
【问题描述】:

我正在使用以下代码在时区之间转换日期时间

TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(site.TimeZone);
returnTime = TimeZoneInfo.ConvertTime(DateTimeOffset.Parse(time.ToString()), timeZone);

CST 时区的夏令时调整发生在 3 月 12 日。那天它给出了一个错误

提供的 DateTime 表示无效时间。例如,时钟向前调整时,被跳过的周期内的任何时间都是无效的

如何更改支持夏令时的日期时间转换

【问题讨论】:

  • time 的值是多少,它应该代表 CST 中的时间,还是其他诸如 UTC 之类的时间?
  • 您可以通过始终在 UTC 中工作并尽可能晚地将任何转换保持到本地时间来修复它,这样就不会在本地时间尝试进一步的转换/处理。由于每个 UTC 值都可以映射到您的本地时间(尽管有时输出不明确),因此您永远不会使用无效时间。
  • 如果有任何 DateTime 则考虑使用 DateTimeOffset。
  • 您应该考虑使用 NodaTime。它的功能比 .NET 的 DateTime 丰富得多。

标签: c# datetime c#-4.0 datetime-conversion


【解决方案1】:

我遇到了类似的问题,并使用这个易于使用的替代方法解决了所有问题:

Noda Time "A better date and time API for .NET"

【讨论】:

    【解决方案2】:

    另一种方法是先转换为 UTC,然后再转换为目标时区。在转换为 UTC 的同时,还要检查传入的时间是否不明确,您可能需要对此进行调整,检查以下How to: Resolve Ambiguous times

    您需要知道源时间值的 TimeZone - 可用于确定时间是否不明确。如果不模糊通过源时区转换为 UTC,方法是检查它是标准时间(应用时区的基本 UTC 偏移量)还是夏令时(应用非基本 UTC 偏移量) - UTC 偏移量、模糊检查和日光检查可以通过 TimeZoneInfo 完成。如果不明确,您可以假设时间是标准时间,或者有另一种方法来指定它是否是日光时间 - 一旦确定,使用之前的偏移值。然后使用目标时区从 UTC 转换。

    【讨论】:

    • 仅链接的答案通常是 Stack Overflow 上的frowned upon。随着时间的推移,链接可能会萎缩并变得不可用,这意味着您的答案将来对用户毫无用处。如果您可以在实际帖子中提供答案的一般详细信息,并引用您的链接作为参考,那将是最好的。
    猜你喜欢
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2015-07-09
    • 2011-06-13
    • 2010-10-15
    相关资源
    最近更新 更多