如何获得过去10年的夏令时界限

时间:2012-10-17 18:28:38

标签: c# .net windows

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

2 个答案:

答案 0 :(得分:5)

查看TimeZone.GetDaylightChanges方法。

编辑:

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

答案 1 :(得分:4)

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

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

  • TimeZone不使用历史数据
  • TimeZoneInfo无法轻松找到转场;你必须自己解释规则数据。 TimeZoneInfo.GetAdjustmentRules 向您提供所有信息,但根据经验,我建议您避免尝试对其进行编码,除非您真的需要。

然而,使用Noda Time可以相当轻松地完成此操作。下面的代码使用BCL时区周围的包装器;将Bcl更改为Tzdb以使用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);
        }
    }
}