.net core 无法在NodeTime中获取亚洲/加尔各答Windows地图

.net core 无法在NodeTime中获取亚洲/加尔各答Windows地图,.net-core,timezone,nodatime,.net Core,Timezone,Nodatime,简单地说,我有一个dotnetweb应用程序,它需要记录用户的时区信息(以便在电子邮件中发送正确的时间) 节点时间2.4.8 “亚洲/加尔各答”时区似乎不存在,我也不确定需要什么才能让它发挥作用。有没有更好的方法来实现这一点?问题是Windows/TZDB映射文件()不包含“Asia/Kolkata”,它包含“Asia/Calcutta” 在用户代码中说明这一点相对比较棘手,这就是为什么我们在NodaTime3.0中引入了它 更新到3.0后,您可以使用: if(!TzdbDateTimeZon

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

节点时间2.4.8


“亚洲/加尔各答”时区似乎不存在,我也不确定需要什么才能让它发挥作用。有没有更好的方法来实现这一点?

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

在用户代码中说明这一点相对比较棘手,这就是为什么我们在NodaTime3.0中引入了它

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

if(!TzdbDateTimeZoneSource.Default.TzdbToWindowsIds.TryGetValue(tzinfo,out var windowsZoneId))
{
抛出新异常($“未映射的时区ID'{tzinfo}'”);
}
//在此处使用windowsZoneId
如果您确实需要坚持使用2.4.8,您可以规范化
tzinfo
TzdbDateTimeZoneSource.Default.WindowsMapping.MapZones.TzdbIds
中的所有条目,但通常情况会更糟


(从2.4.8到3.0.0的更新对大多数用户来说应该是无缝的。这是一个突破性的变化,主要是因为删除了二进制序列化,我希望您没有使用…)

只是为了澄清-这是野田佳彦的时间吗?看起来像是。。。在这种情况下,我建议添加正确的标签。如果是的话,我怀疑这是野田佳彦时代的版本在这里很重要。它不应该和系统时区数据库有任何关系。更新了,是的Nodatime。对。我怀疑这是一个问题,你实际上在不同的平台上使用不同版本的野田佳彦时间(因此使用不同的数据)。请在本地和Azure上登录TzdbDateTimeZoneSource.Default.VersionId,并更新问题。(同时记录
tzinfo
以检查您在这两种情况下是否真的在检查相同的东西-我们不知道该值来自何处。)一旦设置好,我想我将能够回答。我感谢@JonSkeet提供的帮助。我假设部署的版本将与我在本地使用的版本相同,因为我在本地构建项目,并简单地将其部署到azure—这有什么不同?(还没有使用任何中间人机器人、CI之类的工具)出现此问题的原因是,我在日志中看到,当用户尝试将其时区更新为此时出现异常。我有一个单元测试,它使用
Asia/Kolkata
运行此函数,并在本地成功。它适用于所有其他时区(到目前为止,我的用户已经注册了wtih)。我只是重新检查了我的测试,有些东西已经关闭,我很快就会回来的。谢谢
using NodaTime.TimeZones;
var winmap = TzdbDateTimeZoneSource.Default.WindowsMapping.MapZones
        .FirstOrDefault(x => x.TzdbIds.Contains(tzinfo));
if (winmap == null) throw new Exception("Invalid timezone");