如何在.NET中的DST时间内获取UTC偏移量

vks*_*ksp 7 .net c# datetime utc dst

我试图在一个时间间隔中看到时区中看到的所有偏移量.下面是我用来实现这个功能,我知道你可以使用TimeZoneInfo.BaseUtcOffset得到UTC offset了在标准时间的时区,但目前还没有类似的方法来获得一个夏令时期间,除非你通过一个特定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);
     }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 6

我试图在一个时间间隔中看到时区中看到的所有偏移量.

强烈建议你不要试图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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

var zone = BclDateTimeZone.FromTimeZoneInfo(tzInfo);
var offsets = zone.GetZoneIntervalsInInterval(interval)
                  .Select(zi => zi.WallOffset)
                  .Distinct();
Run Code Online (Sandbox Code Playgroud)

这假设你的意思与我所说的"偏移"相同(即UTC和当地时间之间的差异).


cfe*_*uke -1

如果您正在做任何复杂的日期处理,您应该看看Noda Time(它是 Joda Time Java 库的一个端口)。它有一个完整的命名空间来处理棘手的时区问题。