【问题标题】:.NET TimeZoneInfo wrong about Daylight savings.NET TimeZoneInfo 关于夏令时错误
【发布时间】: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=198
http://www.timezoneconverter.com/cgi-bin/tzc.tzc

【问题讨论】:

  • 你在什么操作系统上测试这个?

标签: .net timezone dst


【解决方案1】:

见:TimeZoneInfo.IsDaylightSaving

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

你也可以看看这个……

TimeZoneInfo.GetAmbiguousTimeOffsets Method

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

【讨论】:

  • 我觉得 IsDaylightSavingTime() 函数会告诉我某个时间是否处于夏令时,这真是太愚蠢了。
  • 我也被这个问题打败了。关于时间是否在 DST 到底有什么不明确的地方?就我而言,IsDaylightSavingTime 在应该为 True 时返回 False,而 IsAmbiguousTime 也为 False。见stackoverflow.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)

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

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 2014-02-22
      • 2011-10-25
      • 2012-07-03
      • 2021-01-08
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多