关于夏令时,.NET TimeZoneInfo错误

Mat*_*att 4 .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();
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ski 5

请参阅:TimeZoneInfo.IsDaylightSaving

因为TimeZoneInfo.IsDaylightSavingTime(DateTime)方法可以为不明确的日期和时间(即,可以表示特定时区中的标准时间或夏令时的日期和时间)返回false,即TimeZoneInfo. IsAmbiguousTime(DateTime)方法可以与IsDaylightSavingTime(DateTime)方法配对,以确定时间是否可以是夏令时.因为模糊的时间可以是夏令时和标准时间......

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

TimeZoneInfo.GetAmbiguousTimeOffsets方法

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

  • 我觉得IsDaylightSavingTime()函数会告诉我时间是否在白天节省,我觉得很傻. (3认同)

Mat*_*int 5

这将起作用:

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);
Run Code Online (Sandbox Code Playgroud)

原来的代码有两个问题:

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

  • 如果类型是本地时区或未指定,则IsDaylightTime该类上的方法将采用本地时区。DateTime调用后ConvertTime,结果类型未指定,因此它根据当地时区的规则进行检查,而不是东部时区的规则。