簡體   English   中英

在 c# 中使用國家/地區名稱、日期時間和時區偏移值獲取 ZoneId

[英]Get ZoneId using country name, datetime and timezone offset values in c#

我有日期時間(yyyy-MM-ddTHH:mm:ss)、時區偏移值(K ie -/+HH:mm)和國家/地區名稱,並且想從我的 Web API 中的這些值中獲取 IANA 格式 ZoneId。

例如:

public static string FetchZoneID(string dateTime, string offset, string countryName)
{        
//fetch zoneID    
return zoneId;
}

對於價值觀

dateTime = "2020-02-06T06:11:01", offset = "+13:00", countryName = "New Zealand"

我應該得到

zoneId = "Pacific/Auckland"

和價值觀

dateTime = "2020-05-06T06:11:01", offset = "+12:00", countryName = "New Zealand"

我應該得到(由於夏令時)

zoneId = "Pacific/Auckland"

目前使用 NodaTime,我能夠獲取特定國家/地區的所有 zoneId,但無法弄清楚如何根據日期時間和偏移值過濾這些。

var zoneIds = TzdbDateTimeZoneSource.Default.ZoneLocations.Where(x => x.CountryName == countryName)
    .Select(x => x.ZoneId);

有人可以幫我嗎?

注意:如果多個 zoneIds 符合給定的偏移量,將使用第一個值。

我將稍微更改您的方法簽名,並展示如何列出給定國家/地區的所有可能時區 ID,其中偏移量與特定本地日期和時間匹配:

public static ICollection<string> FetchZoneIds(OffsetDateTime dateTime, string countryCode)
{
    return TzdbDateTimeZoneSource.Default.ZoneLocations
        .Where(x => x.CountryCode == countryCode)
        .Select(x => dateTime.InZone(DateTimeZoneProviders.Tzdb[x.ZoneId]))
        .Where(x => x.Offset == dateTime.Offset)
        .Select(x => x.Zone.Id)
        .ToList();
}

這是一個小測試方法來說明使用字符串輸入調用並轉儲到輸出:

private static void Test(string dtoString, string countryCode)
{
    Console.WriteLine($"{dtoString} ({countryCode})");

    var offsetDateTime = OffsetDateTimePattern.GeneralIso.Parse(dtoString).Value;
    var zoneIds = FetchZoneIds(offsetDateTime, countryCode);

    foreach (var zoneId in zoneIds)
    {
        Console.WriteLine(zoneId);
    }

    Console.WriteLine();
}

您的第一個示例給出了單一的預期結果:

Test("2020-02-06T06:11:01+13:00", "NZ");
2020-02-06T06:11:01+13:00 (NZ)
Pacific/Auckland

你的第二個例子也是如此:

Test("2020-05-06T06:11:01+12:00", "NZ");
2020-05-06T06:11:01+12:00 (NZ)
Pacific/Auckland

但是看看這里發生了什么:

Test("2020-11-01T01:00:00-05:00", "US");
2020-11-01T01:00:00-05:00 (US)
America/New_York
America/Detroit
America/Kentucky/Louisville
America/Kentucky/Monticello
America/Indiana/Indianapolis
America/Indiana/Vincennes
America/Indiana/Winamac
America/Indiana/Marengo
America/Indiana/Petersburg
America/Indiana/Vevay
America/Chicago
America/Indiana/Tell_City
America/Indiana/Knox
America/Menominee
America/North_Dakota/Center
America/North_Dakota/New_Salem
America/North_Dakota/Beulah

重要的是,請注意,有在結果條目東部時間和中部時間兩者,其中主要是America/New_YorkAmerica/Chicago 怎么可能?

不,這不是錯誤。 您可以在此處進行驗證 在美國,夏令時不會一下子發生。 它從東到西一次經過一個時區。 因此,當回退轉換發生在東部時區(美國東部時間 2:00 變為東部時間 1:00)時,中部時區仍為美國東部時間 1:00。 它不會再過渡一個小時。 換句話說,它是1:00與UTC-5在同一時間在兩個EST和CDT偏移。

如果您不關心這些事情,請確保您可以只執行.FirstOrDefault() (當沒有匹配項時,默認null字符串)。 但是您確實可能會遇到這樣的邊緣情況。

暫無
暫無

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

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