微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在NodaTime中无法获得Asia / Kolkata WindowsMap

如何解决在NodaTime中无法获得Asia / Kolkata WindowsMap

简单地说,我有一个点网Web应用程序,它需要记录用户的时区信息(以便在电子邮件中发送正确的时间)。

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

NodaTime 2.4.8

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

“亚洲/加尔各答”时区似乎不存在,而且我不确定要使其工作需要什么。有没有更好的方法来实现这一目标?

解决方法

问题在于Windows / TZDB映射文件(example)不包含“亚洲/加尔各答”,而包含“亚洲/加尔各答”。

在用户代码中对此进行解释比较棘手,这就是为什么在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的更新应该是无缝的。由于删除了二进制序列化,这是主要的重大更改,我希望您不要使用... )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。