如何使用C#获取每个时区的夏令时界限?
答案 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);
}
}
}