在 NodaTime 中无法获取 Asia/Kolkata WindowsMap

Cannot get Asia/Kolkata WindowsMap in NodaTime

简而言之,我有一个.net 网络应用程序,它需要记录用户的时区信息(以便在电子邮件中发送正确的时间)。

using NodaTime.TimeZones;
var winmap = TzdbDateTimeZoneSource.Default.WindowsMapping.MapZones
        .FirstOrDefault(x => x.TzdbIds.Contains(tzinfo));
if (winmap == null) throw new Exception("Invalid timezone");

野田时光 2.4.8

https://nodatime.org/2.4.x/api/NodaTime.TimeZones.TzdbDateTimeZoneSource.html#NodaTime_TimeZones_TzdbDateTimeZoneSource_WindowsMapping

“Asia/Kolkata”时区似乎不存在,我不确定需要什么才能使其正常工作。有没有更好的方法来实现这个?

问题是 Windows/TZDB 映射文件 (example) 不包含“Asia/Kolkata”,它包含“Asia/Calcutta”。

在用户代码中考虑这一点相对棘手,这就是我们在 NodaTime 3.0 中引入 TzdbDateTimeZoneSource.TzdbToWindowsIds.

的原因

更新到3.0后,您可以使用:

if (!TzdbDateTimeZoneSource.Default.TzdbToWindowsIds.TryGetValue(tzinfo, out var windowsZoneId))
{
   throw new Exception($"Unmapped time zone ID '{tzinfo}'");
}
// Use windowsZoneId here

如果您真的需要坚持使用 2.4.8,您可以规范化 tzinfoTzdbDateTimeZoneSource.Default.WindowsMapping.MapZones.TzdbIds 中的所有条目,但那将是通常更糟。

(从 2.4.8 到 3.0.0 的更新对于大多数用户来说应该是无缝的。这是一个重大变化主要是 由于删除了二进制序列化,我希望你不使用...)