【问题标题】:Convert a future local DateTime into UTC将未来的本地 DateTime 转换为 UTC
【发布时间】:2018-03-07 04:58:06
【问题描述】:

我在将 EWS 约会的开始时间 DateTime 从本地时间转换为 UTC 时遇到问题。从 EWS,我得到了约会的 DateTimeTimeZone。我一直在使用.ToUniversalTime()DateTime 转换为UTC。

但是,当当前时间和约会的开始时间在夏令时的不同边时(例如,开始 DateTime 可能是 2018 年 3 月 15 日),.ToUniversalTime() 转换使用 current UTC 偏移量,导致 DateTime 偏移一小时。

我需要某种方法来获取未来某个日期的 UTC 偏移量。

我最好的计划是使用.ToUniversalTime() 来获得正确的UTC 开始时间DateTime 的近似值。大多数情况下,这将是正确的 UTC 转换,如果不是,它将接近。从理论上讲,我应该能够在这个估计的 UTC 时间获得预测的 UTC 偏移量,并将原始开始 DateTime 重新转换为 UTC。

我知道如果在夏令时切换后一小时内开始DateTime,这将失败,但这对我来说已经足够接近了。我将不胜感激任何建议或替代方法,但我真正在寻找的是在未来某个日期获得估计的 UTC 偏移量的某种方法。

【问题讨论】:

    标签: c# .net datetime timezone exchangewebservices


    【解决方案1】:

    一些事情:

    • DateTime.ToUniversalTime() 只能从系统的本地时区转换。它不知道您约会中的时区。

    • 您认为它使用当前的 UTC 偏移量是不正确的。它使用提供的时间有效的偏移量。同样,它只知道与系统本地时区的偏移量。

      • 请注意,如果您在非常旧的操作系统 (Windows XP) 上运行,它只会知道当前规则(对于已更改规则的时区)。但这一切在现代 Windows 中都得到了正确处理。
    • 考虑使用TimeZoneInfo 对象及其ConvertTimeToUtc 方法,而不是.ToUniversalTime()。由于您已经有了 EWS 的时区,这可能是最简单的方法。

    • 唯一涉及的“估计”是您估计时区规则将来不会改变。这可能会也可能不会。因为我们看不到未来,所以我们不可能知道。你的代码本身不需要做任何估计——框架提供的函数已经足够精确,只要它们有可用的数据。

    • StackOverflow 上已经有大量关于此主题的信息。提问前请先搜索。谢谢。

    【讨论】:

    • 此外....没有办法提前做到这一点,因为日期可以改变我的未来,而且如果我们选择的话,显然即使在它们发生之后......愚蠢的人类......这将要求您将自己的日历系统保持在最低限度,该系统知道官方和非官方的储蓄时间
    • 嗨,马特,感谢您的意见。在发帖之前,我确实花了相当长的时间进行研究,但未能找到满意的答案。 EWS 返回带有与客户端计算机匹配的 TimeZone 的开始时间。我从 EWS 获得的约会(包括 PDT 中的约会)将与 PST 时区一起返回。这是我困惑的根源。但是,开始时间以 UTC 格式返回,并且与给定的 StartTimeZone 不匹配,因此无需进行转换。我的实际问题的根源是相关的,但无需转换体操即可解决。
    • 看看the timezone tag wiki。在有关 Windows 时区名称的部分中,您会注意到它提到仅仅因为您看到“太平洋标准时间”并不意味着在适用时不考虑 PDT。
    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2012-12-05
    • 2011-09-29
    相关资源
    最近更新 更多