将未来的本地DateTime转换为UTC

时间:2018-03-07 04:58:07

标签: c# .net datetime timezone exchangewebservices

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

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

我需要一些方法来获取未来日期的UTC偏移量。

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

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

3 个答案:

答案 0 :(得分:3)

一些事情:

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

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

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

  • 唯一的估算"涉及的是,您正在估计未来不会发生变化的时区规则。这可能会或可能不会成为。既然我们看不到未来,我们就不可能知道。您的代码本身不需要做任何估计 - 框架提供的功能足够精确,只要它们有可用的数据。

  • StackOverflow上已有关于此主题的 ton 信息。请在询问前搜索。感谢。

答案 1 :(得分:-1)

PLease使用这种方法可以解决您的问题

//Replace Your TimeZOne info
TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)");

//Replace your date value here
DateTime dt = new DateTime();

DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dt, infotime).ToUniversalTime();

答案 2 :(得分:-1)

请保留GMT中的所有日期,这些日期不会成为DST惯例的受害者,并转换为用户本地TZ以供展示或根据需要...

E.g。保持您的系统在GMT,所以UTC === localtime。