我正在尝试了解在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:00TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time")
返回的对象中的BaseUtcOffset
值也是00:00(尽管这是意料之中的事)- 上面的
ConvertTime()
函数总是返回不到一小时的当前时间。(有点不奇怪,因为TimeZoneInfo.Local.SupportsDaylightSavingsTime
值总是false。)
我应该使用TimeZoneInfo.Local
的另一种方式来获取UTC和当前时区之间的偏移量吗?我需要将夏令时包括在内。
几件事:
-
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
可能会返回不同的结果。