TimeZoneInfo BaseUtcOffset在Windows Embedded 7上始终为零

时间:2016-07-18 14:43:35

标签: c# timezone windows-embedded

我正试图在Windows Embedded 7上运行的应用程序和UTC时间之间找到区别。为此,我有以下代码:

TimeZoneInfo utcTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTime localTime = DateTime.Now;
DateTime utcTime = TimeZoneInfo.ConvertTime(localTime, TimeZoneInfo.Local, utcTimeZone);
TimeSpan utcOffset = localTime - utcTime;

这在我自己的开发PC上正常运行,运行Windows 7.但是,当我在运行Windows Embedded 7的设备上安装我的应用程序时,无论我将其设置为什么时区,当我运行我的应用程序时,

  • TimeZoneInfo.Local.BaseUtcOffset的值始终为00:00。
  • BaseUtcOffset返回的对象中的TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time")值也是00:00(虽然这是预期的)。
  • 上面的ConvertTime()函数始终返回当前时间少于一小时。 (由于TimeZoneInfo.Local.SupportsDaylightSavingsTime值始终为假,所以并不感到惊讶。)

我应该使用TimeZoneInfo.Local的其他方式来获取UTC与当前时区之间的偏移量吗?我需要在此包括夏令时。

1 个答案:

答案 0 :(得分:0)

一些事情:

  • ID为"GMT Standard Time"的时区不是UTC - 它是英国时间。它的显示名称与“都柏林,爱丁堡,里斯本,伦敦”相匹配。它在冬天使用UTC + 0,夏天使用UTC + 1作为夏令时。

  • UTC时区ID只是"UTC" - 虽然您很少需要它。

  • 如果TimeZoneInfo.Local.BaseUtcOffset为零,则表示计算机的时区设置为UTC + 0作为其标准偏移量。目前在Windows中定义了四种。此属性不反映夏令时。

  • 确认偏移量将根据您运行代码的一年中的哪个时间而变化。时区与时区偏移量不同。

  • 既然你说上面的代码是零,我猜你的当地时区要么是前面提到的英国时间,要么就是摩洛哥的卡萨布兰卡。这是因为您从当前也是UTC + 1的另一个时区减去UTC + 1本地时间。 1 - 1 = 0

  • 执行此操作的正确方法根本不涉及减法。只需使用GetUtcOffset方法:

    TimeSpan offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.Now);
    

    再次注意,这会返回当前偏移量。在一年中的不同时间运行它,或者通过传递不同的值而不是DateTime.Now可能会返回不同的结果。