簡體   English   中英

noda時間:如何表示“標准時間”

[英]noda time: how to represent “standard time”

我從文本文件中接收數據,其中日期通常是“標准時間”(如中央標准時間或東部標准時間。我特別指的是沒有觀察到夏令時調整 )。 使用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,則配置應用程序要容易得多。

我錯過了這樣做的方法嗎? 或者我是如何概念化問題的,這是不是正確的做法?

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();
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM