1

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

这在我自己的运行 Windows 7 的开发 PC 上运行良好。但是,当我在运行 Windows Embedded 7 的设备上安装我的应用程序时,无论我将它设置为哪个时区,当我运行我的应用程序时,

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

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

4

1 回答 1

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

于 2016-07-18T17:51:38.543 回答