在Windows Embedded 7上,TimeZoneInfo BaseUtcOffset始终为零

本文关键字:BaseUtcOffset TimeZoneInfo Windows Embedded | 更新日期: 2023-09-27 17:57:33

我正在尝试了解在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;

这在我自己的开发电脑上运行得很好,运行的是Windows7。然而,当我在运行Windows Embedded 7的设备上安装应用程序时,无论我将其设置为哪个时区,当我运行应用程序时

  • TimeZoneInfo.Local.BaseUtcOffset的值始终为00:00
  • TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time")返回的对象中的BaseUtcOffset值也是00:00(尽管这是意料之中的事)
  • 上面的ConvertTime()函数总是返回不到一小时的当前时间。(有点不奇怪,因为TimeZoneInfo.Local.SupportsDaylightSavingsTime值总是false。)

我应该使用TimeZoneInfo.Local的另一种方式来获取UTC和当前时区之间的偏移量吗?我需要将夏令时包括在内。

在Windows Embedded 7上,TimeZoneInfo BaseUtcOffset始终为零

几件事:

  • 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可能会返回不同的结果。