c# - 如何在 .NET 中获取夏令时期间的 UTC 偏移量

标签 c# .net datetime utc dst

我试图在一个时间间隔内获取在一个时区内看到的所有偏移量。下面是我用来完成此操作的函数,我知道您可以使用 TimeZoneInfo.BaseUtcOffset 获取标准时间时区的 UTC 偏移量,但没有类似的方法方法在夏令时期间获取一个,除非您将特定的 DST 时间点传递给 GetUTCOffset() 方法。

static void GetOffsets(DateTime startTime, DateTime endTime, TimeZoneInfo tz)
{
    var result = new HashSet<int>();
    var adjRules = tz.GetAdjustmentRules();
    result.Add(tz.BaseUtcOffset);

    foreach (var adjustmentRule in adjRules)
    {
        if ((startTime >= adjustmentRule.DateStart && startTime <= adjustmentRule.DateEnd) || (endTime >= adjustmentRule.DateStart && endTime <= adjustmentRule.DateEnd) ||
             (stTime <= adjustmentRule.DateStart && endTime >= adjustmentRule.DateEnd))
        {
            if(adjustmentRule.DaylightDelta != TimeSpan.Zero)
            {
                if (!result.Contains(tz.BaseUtcOffset + adjustmentRule.DaylightDelta))
                      result.Add((tz.BaseUtcOffset + adjustmentRule.DaylightDelta));
            }
         }
     }

     foreach (var res in result)
     {
         Console.WriteLine(res);
     }
}

如果有更好的方法,请告诉我。

最佳答案

I am trying to get all offsets seen in a timezone, in an interval.

强烈建议您避免尝试直接使用TimeZoneInfo。在某些年份,某些区域的调整规则可能出奇地尴尬,正如我发现的那样。

虽然我有偏见,但我建议使用 Noda Time ,它可以包装 TimeZoneInfo 并通过 BclDateTimeZone.FromTimeZoneInfo 为您完成繁重的工作。你的问题在要求方面并不完全清楚,但如果你能多说一点你想做什么,我可以为你编写适当的 Noda Time 代码。

你的初始描述可以用这样的东西来实现:

public IEnumerable<ZoneInterval> GetZoneIntervalsInInterval
    (this DateTimeZone zone, Interval interval)
{
    Instant current = interval.Start;
    while (current < interval.End && current != Instant.MaxValue)
    {
        ZoneInterval zi = zone.GetZoneInterval(current);
        yield return zi;
        current = zi.End;
    }
}

然后:

var zone = BclDateTimeZone.FromTimeZoneInfo(tzInfo);
var offsets = zone.GetZoneIntervalsInInterval(interval)
                  .Select(zi => zi.WallOffset)
                  .Distinct();

这是假设您和我所说的“偏移量”指的是同一个东西(即 UTC 和本地时间之间的差异)。

关于c# - 如何在 .NET 中获取夏令时期间的 UTC 偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13328349/

相关文章:

c# - Winforms:如何正确打开组合框?

.net - 异步等待方法比较

c# - .NET 中的多个监视器

c# - 带有 Entity Framework 的 SQLite DATETIME 列

php - 在 php 中调用未定义的方法 DateTime::add 方法

c# - System.Threading.Tasks.Parallel.For 与 Openxml 出现意外结果

c# - 使用附加字符串的整数对 WPF 数据网格进行排序

c# - 如何将其中包含空格的列名称映射到 POCO 属性?

c# - File.WriteAllBytes 不阻塞

javascript - 在 JavaScript 中检测系统时间的变化