2011-02-14 45 views
3

任何人都可以帮助理解这一点。 3.5中的微软TimeZoneInfo类告诉我下面的GMT日期并不是东部时区的夏令时,但它是。.NET TimeZoneInfo关于夏令时的错误

// 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

+0

你在测试什么操作系统? – x0n 2011-02-14 04:00:41

回答

5

参见:TimeZoneInfo.IsDaylightSaving

因为 TimeZoneInfo.IsDaylightSavingTime(DATETIME) 方法可以返回虚假的日期和 模糊的时间(即中, 日期和时间可以表示 一个标准时间或在特定的时间区 日光节约 时间), TimeZoneInfo.IsAmbiguousTime(日期时间) 方法可以与 IsDaylightSavingTime(日期时间)方法 配对以确定时间是否可能是夏令时的 。因为一个 模棱两可的时间是一个既可以是 日光节约时间和标准 时间...

而且你可能看这...

TimeZoneInfo.GetAmbiguousTimeOffsets Method

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

+3

我觉得如此愚蠢,认为IsDaylightSavingTime()函数会告诉我是否夏时制。 – Matt 2011-02-14 14:04:44

1

TimeZoneInfo.GetUtcOffset(DateTime)

正确返回日光节约偏移考虑进来,如果在指定的日期是周期内

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值w如提供的那样,它在Parse声明中转换为本地类型。因此可以在那里引入歧义。

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