[英]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_York
和America/Chicago
。 怎么可能?
不,這不是錯誤。 您可以在此處進行驗證。 在美國,夏令時不會一下子發生。 它從東到西一次經過一個時區。 因此,當回退轉換發生在東部時區(美國東部時間 2:00 變為東部時間 1:00)時,中部時區仍為美國東部時間 1:00。 它不會再過渡一個小時。 換句話說,它是1:00與UTC-5在同一時間在兩個EST和CDT偏移。
如果您不關心這些事情,請確保您可以只執行.FirstOrDefault()
(當沒有匹配項時,默認null
字符串)。 但是您確實可能會遇到這樣的邊緣情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.