如何使用 C# 获取每个时区的夏令时边界?
问问题
810 次
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 时区的包装器;更改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);
}
}
}
于 2012-10-17T18:39:09.070 回答