C# 在c中使用国家名称、日期时间和时区偏移量值获取ZoneId

C# 在c中使用国家名称、日期时间和时区偏移量值获取ZoneId,c#,datetime,asp.net-core,timezone,nodatime,C#,Datetime,Asp.net Core,Timezone,Nodatime,我有datetimeyyyy-MM-ddTHH:MM:ss、时区偏移值K I.e-/+HH:MM和国家/地区名称,希望从我的web API中的这些值获取IANA格式的区域ID 例如: 价值观 dateTime = "2020-02-06T06:11:01", offset = "+13:00", countryName = "New Zealand" dateTime = "2020-05-06T06:11:01", offset = "+12:00", countryName = "New

我有datetimeyyyy-MM-ddTHH:MM:ss、时区偏移值K I.e-/+HH:MM和国家/地区名称,希望从我的web API中的这些值获取IANA格式的区域ID

例如:

价值观

dateTime = "2020-02-06T06:11:01", offset = "+13:00", countryName = "New Zealand"
dateTime = "2020-05-06T06:11:01", offset = "+12:00", countryName = "New Zealand"
我应该

zoneId = "Pacific/Auckland"
和价值观

dateTime = "2020-02-06T06:11:01", offset = "+13:00", countryName = "New Zealand"
dateTime = "2020-05-06T06:11:01", offset = "+12:00", countryName = "New Zealand"
我该去DST了

zoneId = "Pacific/Auckland"
目前使用NodaTime,我能够获取特定国家/地区的所有ZoneID,但无法确定如何根据日期时间和偏移量值过滤这些ZoneID

var zoneIds = TzdbDateTimeZoneSource.Default.ZoneLocations.Where(x => x.CountryName == countryName)
    .Select(x => x.ZoneId);
有人能帮我吗


注意:如果多个时区ID符合给定偏移量的条件,将使用第一个值。

我将稍微更改您的方法签名,并显示如何为偏移量与特定本地日期和时间匹配的给定国家/地区创建所有可能时区ID的列表:

公共静态ICollection FetchZoneidSofSetDateTime日期时间,字符串countryCode { 返回TzdbDateTimeZoneSource.Default.ZoneLocations .Wherex=>x.CountryCode==CountryCode .Selectx=>dateTime.InZoneDateTimeZoneProviders.Tzdb[x.ZoneId] 其中x=>x.Offset==dateTime.Offset .Selectx=>x.Zone.Id 托利斯特先生; } 这里有一个小测试方法来说明使用字符串输入调用和转储到输出:

私有静态void Teststring dtoString,string countryCode { Console.WriteLine${dtoString}{countryCode}; var offsetDateTime=OffsetDateTimePattern.GeneralIso.ParsedtoString.Value; var zoneIds=FetchZoneIdsoffsetDateTime,国家代码; foreach var zoneId在zoneId中 { Console.WriteLinezoneId; } Console.WriteLine; } 您的第一个示例给出了一个预期结果:

Test2020-02-06T06:11:01+13:00,新西兰; 2020-02-06T06:11:01+13:00新西兰 太平洋/奥克兰 第二个例子也是如此:

Test2020-05-06T06:11:01+12:00,新西兰; 2020-05-06T06:11:01+12:00新西兰 太平洋/奥克兰 但看看这里发生了什么:

Test2020-11-01T01:00:00-05:00,美国; 2020-11-01T01:00:00-05:00美国 美国/纽约 美国/底特律 美国/肯塔基/路易斯维尔 美国/肯塔基州/蒙蒂塞洛 美国/印第安纳州/印第安纳波利斯 美国/印第安纳/文森斯 美国/印第安纳州/维那马克 美洲/印第安纳/马伦戈 美国/印第安纳州/彼得堡 美国/印第安纳/维维 美国/芝加哥 美国/印第安纳州/泰尔尤市 美国/印第安纳州/诺克斯 美国/美诺米尼 美国/北达科他州/中心 美国/北达科他州/新塞勒姆 美国/北达科他州/比拉 重要的是,请注意,结果中有东部时间和中部时间的条目,主要是美洲/纽约和美洲/芝加哥。这怎么可能

不,这不是虫子。在美国,夏令时并不是一下子就能实现的。从东到西,它一次只经过一个时区。因此,当东部时区东部夏令时2:00变为东部夏令时1:00时,中部时区仍在东部夏令时1:00。再过一个小时它就不会转换了。换句话说,它是1:00,同时在EST和CDT中有UTC-5偏移量


如果您不关心这些事情,当然可以只执行.FirstOrDefault,在没有匹配项时默认为空字符串。但您可能确实会遇到这样的边缘情况。

为什么?可能有10个城市具有相同的偏移量,那么为什么你认为你应该得到布里斯班?我不介意为给定的输入获得多个zoneId。我的观点是它不是唯一的。ZoneLocation值未内置到网络库中,应用程序必须设置参数。更新了我的示例以避免混淆请注意,美国/底特律和美国/纽约几乎总是具有相同的偏移量,但在同一国家/地区是两个不同的时区。你想要哪一个?另一个例子是亚洲/上海和亚洲/香港。我理解您对边缘案例的关注,这是我们申请的文件限制,可以罚款。