关于c#:将未来的本地DateTime转换为UTC

Convert a future local DateTime into UTC

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

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

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

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

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


几件事:

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

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

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

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

  • StackOverflow上已经有很多关于这个主题的信息了。询问前请先搜索。谢谢。


只需将所有日期保持在格林尼治标准时间内,而不是成为DST公约的牺牲品,并将其转换为用户本地TZ以供显示或根据需要…

例如,保持您的系统在格林尼治标准时间,所以UTC==localtime。


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

1
2
3
4
5
6
7
//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();