3

如何使用 C# 获取每个时区的夏令时边界?

4

2 回答 2

5

看一下TimeZone.GetDaylightChanges方法。

编辑:

查看 TimeZone 类,它似乎只支持本地时区,并且只支持当前年份。看一下TimeZoneInfo.GetAdjustmentRules,它可以让您获得任意时区的调整规则。该页面上的示例甚至看起来与您在此处的任务非常相似。

于 2012-10-17T18:34:08.343 回答
4

免责声明:我是下面引用的 Noda Time 库的主要作者 :)

仅使用vanilla .NET 代码相对比较棘手:

  • TimeZone不使用历史数据
  • TimeZoneInfo不容易找到过渡;基本上,您必须自己解释规则数据。确实为您提供了所有信息,但根据经验,我建议您避免尝试针对它进行编码,除非您确实必须这样做。TimeZoneInfo.GetAdjustmentRules

但是,使用Noda Time,您可以相当轻松地做到这一点。下面的代码使用 BCL 时区的包装器;更改BclTzdb使用 TZDB 时区(“欧洲/伦敦”等)。

using System;
using NodaTime;

class Test
{
    static readonly Instant Start = Instant.FromUtc(2002, 10, 17, 0, 0);
    static readonly Instant End = Instant.FromUtc(2012, 10, 17, 0, 0);

    static void Main()
    {
        var provider = DateTimeZoneProviders.Bcl;
        foreach (var id in provider.Ids)
        {
            var zone = provider[id];
            ShowTransitions(zone);
        }        
    }

    static void ShowTransitions(DateTimeZone zone)
    {
        Console.WriteLine("{0}:", zone.Id);
        var zoneInterval = zone.GetZoneInterval(Start);
        while (zoneInterval.End < End)
        {
            Console.WriteLine("{0} - {1}: {2}",
                              zoneInterval.Start,
                              zoneInterval.End,
                              zoneInterval.WallOffset);
            zoneInterval = zone.GetZoneInterval(zoneInterval.End);
        }
    }
}
于 2012-10-17T18:39:09.070 回答