【发布时间】:2019-01-15 18:34:20
【问题描述】:
英国夏令时每年都会在 3 月和 10 月调整时钟。在 1968 年至 1971 年期间,英国尝试将 BST 作为永久选项,因此时钟在 1968 年 3 月调高 1 小时,直到 1971 年 10 月才恢复。
我正在用 Javascript 创建日期,将它们序列化为 JSON 并发布到 WebApi。
目前使用 Windows 7 作为开发环境,Windows 不认为那个时期是 BST。例如 01/01/1970 应该是夏令时,但是
new System.DateTime(1970, 01, 01, 00, 00, 00).IsDaylightSavingTime();
返回 false。
还有……
System.TimeZone.CurrentTimeZone.GetDaylightChanges(1970)
{System.Globalization.DaylightTime}
Delta: {01:00:00}
End: {25/10/1970 02:00:00}
Start: {29/03/1970 01:00:00}
1970 年应该有一个涵盖全年的规则,因为全年都是 BST。
是否有补丁可以纠正 Windows 中的缺陷?
【问题讨论】:
-
没有。没有 BST - 它只是一个非正式的首字母缩略词。您的代码虽然没有显示任何使用 specific 时区的尝试。它隐含地使用 current ,我敢打赌没有这样的规则。
-
时区的实际标准是 IANA 时区数据库。对于伦敦,时区是
Europe/London。如果时区很重要,您应该使用像 NodaTime 这样的库,其中包括 IANA 数据库 -
就是这样;时区无关紧要,客户端和服务器位于同一时区,因此序列化和反序列化时间应该遵循相同的规则,但它们不是。对于 1968 - 1971 年期间内的日期,日期被序列化和反序列化(在同一台机器上)可能会损失一个小时。
-
你为什么认为你的当前时区有这样的规则?还是时区规则可以追溯到那么远?这与序列化或反序列化无关,除非您忘记包含偏移量或 IANA 时区名称
-
如果你关心偏移量不要假设。不要使用 DateTime,使用 DateTimeOffset。序列化时使用 ISO8601 格式 with 偏移量。如果您关心时间 zones,请使用 IANA 时区名称和支持它们的库。规则可以追溯到 1800 年代
标签: c# windows timezone timezone-offset