.NET TimeZoneInfo 关于夏令时错误

Posted

技术标签:

【中文标题】.NET TimeZoneInfo 关于夏令时错误【英文标题】:.NET TimeZoneInfo wrong about Daylight savings 【发布时间】:2011-06-26 16:45:42 【问题描述】:

任何人都可以帮助理解这一点。 Microsoft 在 3.5 中的 TimeZoneInfo 类告诉我以下 GMT 日期不是东部时区的夏令时,但它是。

// Get Eastern Timezone
TimeZoneInfo tzEasternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

// Convert to EST 
DateTime easternTime = TimeZoneInfo.ConvertTime(DateTime.Parse("2009-11-01T05:00:00Z"), tzEasternZone);

// Daylight saving IS in effect on this date, but Microsoft doesn't think so
Boolean isDaylight = easternTime.IsDaylightSavingTime();

这里有 2 个网站说它是夏令时:http://www.timeanddate.com/worldclock/converted.html?month=11&day=1&year=2009&hour=5&min=0&sec=0&p1=0&p2=198http://www.timezoneconverter.com/cgi-bin/tzc.tzc

【问题讨论】:

你在什么操作系统上测试这个? 【参考方案1】:

见:TimeZoneInfo.IsDaylightSaving

因为 TimeZoneInfo.IsDaylightSavingTime(DateTime) 方法可以返回 false 的日期和 模棱两可的时间(即 可以代表的日期和时间 标准时间或日光 在特定时间节省时间 区),该 TimeZoneInfo.IsAmbiguousTime(DateTime) 方法可以与 IsDaylightSavingTime(DateTime) 方法 确定一个时间是否可能是 夏令时。因为一个 模棱两可的时间是一个可以两者兼而有之的时间 夏令时和标准 时间……

你也可以看看这个……

TimeZoneInfo.GetAmbiguousTimeOffsets Method

返回有关可以将模糊日期和时间映射到的可能日期和时间的信息。

【讨论】:

我觉得 IsDaylightSavingTime() 函数会告诉我某个时间是否处于夏令时,这真是太愚蠢了。 我也被这个问题打败了。关于时间是否在 DST 到底有什么不明确的地方?就我而言,IsDaylightSavingTime 在应该为 True 时返回 False,而 IsAmbiguousTime 也为 False。见***.com/questions/8356866/…【参考方案2】:

这将起作用:

TimeZoneInfo tzEasternZone = TimeZoneInfo.FindSystemTimeZoneById(
                                          "Eastern Standard Time");

DateTime utc = DateTime.Parse("2009-11-01T05:00:00Z",
                              CultureInfo.InvariantCulture,
                              DateTimeStyles.RoundtripKind);

bool isDaylight = tzEasternZone.IsDaylightSavingTime(utc);

原始代码有两个问题:

即使提供了 UTC 值,它也会在 Parse 语句中转换为本地类型。所以这里可能会引入歧义。

DateTime 类上的 IsDaylightTime 方法将假定本地时区类型为本地或未指定。调用ConvertTime后,结果是unspecified kind,所以是在检查当地时区的规则,而不是东部时区的规则。

【讨论】:

【参考方案3】:

TimeZoneInfo.GetUtcOffset(DateTime)

如果指定日期在周期内,则正确返回考虑夏令时的偏移量

【讨论】:

以上是关于.NET TimeZoneInfo 关于夏令时错误的主要内容,如果未能解决你的问题,请参考以下文章

TimeZoneInfo DST 与 Windows 设置

如何确定给定日期是不是在 .NET 2.0 中给定时区的夏令时?

如何在 .NET 中的 DST 时间获取 UTC 偏移量

在 unix (nginx) 上托管时 .NET Core 中的 TimeZoneInfo

如何判断是否英国夏令时

检查夏令时是否有效?