.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 关于夏令时错误的主要内容,如果未能解决你的问题,请参考以下文章
如何确定给定日期是不是在 .NET 2.0 中给定时区的夏令时?