关于夏令时,.NET TimeZoneInfo错误

时间:2011-02-14 03:50:58

标签: .net timezone dst

任何人都可以帮助理解这一点。微软在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=198
http://www.timezoneconverter.com/cgi-bin/tzc.tzc

3 个答案:

答案 0 :(得分:5)

请参阅:TimeZoneInfo.IsDaylightSaving

  

因为   TimeZoneInfo.IsDaylightSavingTime(DATETIME)   方法可以为日期返回false   时间不明确(即a   可以代表的日期和时间   无论是标准时间还是日光   节省特定时间的时间   区),   TimeZoneInfo.IsAmbiguousTime(DATETIME)   方法可以配对   IsDaylightSavingTime(DateTime)方法   确定一个时间是否可以   夏令时。因为一个   模棱两可的时间可以是两者兼而有之   夏令时和标准   时间...

你也可以看看......

TimeZoneInfo.GetAmbiguousTimeOffsets Method

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

答案 1 :(得分:4)

这将有效:

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语句中转换为本地种类。因此可以引入歧义。

  • IsDaylightTime类的DateTime方法将采用本地时区,如果类型是本地时区或未指定。在调用ConvertTime之后,结果具有未指定的种类,因此它检查的是当地时区的规则,而不是东部时区。

答案 2 :(得分:1)

TimeZoneInfo.GetUtcOffset(DateTime)

如果指定的日期在期间

内,则正确地返回带有夏令时的偏移量