我在将 EWS 约会的开始DateTime
从本地时间转换为 UTC 时遇到问题。从 EWS 那里,我得到了约会的DateTime
和TimeZone
。我一直在使用.ToUniversalTime()
将DateTime
转换为UTC。
但是,当当前时间和约会的开始时间位于夏令时的不同方面(例如,开始DateTime
可能是 2018 年 3 月 15 日),则.ToUniversalTime()
转换将使用当前的UTC 偏移量,这会导致日期时间相差一小时。
我需要某种方法在未来某个日期获取 UTC 偏移量。
我最好的计划是使用.ToUniversalTime()
来获得正确 UTC 开始DateTime
的近似值。大多数情况下,这将是正确的 UTC 转换,如果不是,它将接近。从理论上讲,我应该能够在这个估计的 UTC 时间获得预测的 UTC 偏移量,并将原始开始日期时间重新转换为 UTC。
我知道如果开始DateTime
发生在夏令时切换后一小时内,这将失败,但这对我来说已经足够接近了。我将不胜感激任何建议或替代方法,但我真正正在寻找的是在未来某个日期获得估计的 UTC 偏移量的某种方法。
几件事:
-
DateTime.ToUniversalTime()
只能从系统的本地时区转换。 它不知道约会中的时区。 -
您不正确地使用它的当前 UTC 偏移量。 它使用在提供的时间生效的偏移量。 同样,它只知道与系统本地时区的偏移量。
- 请注意,如果您在非常旧的操作系统(Windows XP)上运行,则它只会知道当前规则(对于已更改规则的时区)。 但这一切都在现代Windows中得到了正确的处理。
-
请考虑使用
TimeZoneInfo
对象及其ConvertTimeToUtc
方法,而不是.ToUniversalTime()
。 由于您已经拥有 EWS 的时区,因此这可能是最简单的路线。 -
唯一涉及的"估计"是您估计时区规则将来不会更改。 这可能会发生,也可能不会发生。 既然我们看不到未来,我们就不可能知道。 您的代码本身不需要做任何估计 - 给定可用的数据,框架提供的函数足够精确。
-
在StackOverflow上已经有大量关于这个主题的信息。 请在询问之前搜索。 谢谢。