【问题标题】:Cannot get Asia/Kolkata WindowsMap in NodaTime在 NodaTime 中无法获取 Asia/Kolkata WindowsMap
【发布时间】:2020-09-24 09:51:21
【问题描述】:

简单地说,我有一个 dot net 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

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

【问题讨论】:

  • 只是为了澄清 - 这是野田时间吗?它看起来像......在这种情况下,我建议添加正确的标签。如果是的话,我怀疑这里重要的是野田时间的版本。它应该与系统时区数据库无关。
  • 已更新,是的 Nodatime。
  • 对。我怀疑这是一个问题,您实际上在不同平台上使用了不同版本的 Noda Time(因此也使用了不同的数据)。请在本地和 Azure 上登录 TzdbDateTimeZoneSource.Default.VersionId,并更新问题。 (同时登录tzinfo 以检查您是否真的在两种情况下检查相同的东西 - 我们不知道该值来自哪里。)一旦到位,我怀疑我将能够回答。
  • 感谢@JonSkeet 的帮助。我假设部署的版本将与我在本地使用的版本相同,因为我在本地构建项目并简单地将其部署到 azure - 它怎么可能不同? (还没有使用任何中间人机器人,CI 的东西)这个问题的原因是因为我在日志中看到当用户尝试将他们的时区更新为此时出现异常。我有一个使用Asia/Kolkata 运行此功能的单元测试,它在本地成功。它适用于所有其他时区(到目前为止,我的用户已经注册了)。
  • 我刚刚仔细检查了我的测试,发现有问题,我会尽快回复,谢谢

标签: .net-core timezone nodatime


【解决方案1】:

问题在于 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 的更新对于大多数用户来说应该是无缝的。这是一个重大更改主要由于删除了二进制序列化,我希望你没有使用它... )

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2017-12-01
    • 2021-04-27
    • 2023-03-04
    • 2021-04-26
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多