Noda Time:如何表示“标准时间”

3
我从一个文本文件中接收数据,其中日期通常是“标准时间”(如中央标准时间或东部标准时间)。我特别指的是没有观察到任何夏令时调整。使用Noda Time,我试图找出最佳表示方式。
我首先想到的是应该为此创建一个DateTimeZone。我注意到某些“标准时间”时区包含在tz数据库中(例如,“America / Cancun”可用于东部标准时间),但其他时区似乎没有任何东西来表示它们在数据库中的“标准时间”变体。
然后我想我应该创建一个Offset,或者直接从Offset创建一个DateTimeZone,但我似乎找不到一种方法来获取DateTimeZone的基本偏移量。对于大陆美国的时区,我相当确定我只需执行DateTimeZone.ForOffset(localTimeZone.MinOffset)(其中localTimeZone 是DateTimeZone),但我非常怀疑这将适用于更奇怪的时区。我也尝试过 DateTimeZone.ForOffset(localTimeZone.GetZoneInterval(SystemClock.Instance.GetCurrentInstant())。StandardOffset),但这样转弯抹角,所以我怀疑它不正确。
我可以只存储与每个文件提供程序相关联的原始偏移量,但如果配置说它处于中央标准时间而不是说它具有-6的偏移量,则配置应用程序要容易得多。
我是否错过了某种方法?或者是我的概念化问题有问题,因此这不是正确的方法?
1个回答

4

对于DateTimeZone来说,并没有必然的单一“基准偏移量”,它可能会随时间变化而改变。例如,阿拉斯加大部分地区的标准时间在1983年从UTC-10变为了UTC-9。

现在,这对你感兴趣的时区可能不是问题...如果是这样,你可以采用“找到当前时刻本地时间区域的标准偏移量,然后从中创建一个恒定偏移量的DateTimeZone”的方法。我可能会使用三个语句而不是你当前的巨型表达式,但它会完成你想要的功能。

如果你想要一个时间区域,它与现有的时间区域等效,包括其标准偏移量的任何更改,但没有任何夏令时,那么就比较难实现了。它可以实现,但不会特别简单。你可能需要自己的DateTimeZone子类,接受现有的DateTimeZone并迭代所有的ZoneInterval值,从时间开始迭代直到某个合适的结束点(例如2200,作为一个远期日期,在它之后相当长一段时间内不会指定任何规则更改),并计算出你的新ZoneInterval值。如果你想要的话,我可以提供一个示例实现,但你应该先考虑它是否符合你的要求...

这里有一些代码向你展示了所有在1930年至2100年之间曾经更改过其标准偏移量的时区-显然,你可以轻松更改时间段,以更接近地匹配你的上下文条件。

using System;
using System.Linq;
using NodaTime;
using NodaTime.Extensions;

class Test
{
    static void Main()
    {
        Instant min = Instant.FromUtc(1930, 1, 1, 0, 0, 0);
        Instant max = Instant.FromUtc(2100, 1, 1, 0, 0, 0);

        foreach (var zone in DateTimeZoneProviders.Tzdb.GetAllZones())
        {
            var initialStandard = zone.GetZoneInterval(min).StandardOffset;
            var zoneIntervals = zone.GetZoneIntervals(min, max);
            var firstChange = zoneIntervals.FirstOrDefault(zi => zi.StandardOffset != initialStandard);
            if (firstChange != null)
            {
                Console.WriteLine(zone.Id);
                Console.WriteLine($"Initial standard offset: {initialStandard}");
                Console.WriteLine($"First different standard offset: {firstChange}");
                Console.WriteLine();
            }
        }
    }
}

谢谢!我将采用恒定偏移的DateTimeZone,标准偏移来自当前时刻。我们所有的输入都是在现在时间之前,所以我不需要过多担心如何表示更改基本偏移后的时间。一旦我们加载了一个输入,我可以只使用“即时”来表示它。 - Nathan Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接