【问题标题】:System.TimeZoneNotFoundException: 'The time zone ID 'Asia/Jerusalem' was not found on the local computer.' [closed]System.TimeZoneNotFoundException:“在本地计算机上找不到时区 ID 'Asia/Jerusalem'。” [关闭]
【发布时间】:2019-12-17 16:30:52
【问题描述】:

有人可以帮助我吗? 我什么都试过了!

【问题讨论】:

  • 你在用单声道吗?
  • stackoverflow.com/questions/7908343/… 我在这个列表中没有看到亚洲/耶路撒冷。你确定它叫那个吗?
  • TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, "Asia/Jerusalem");这条线在我同事的电脑上运行
  • 是的,我正在使用单声道
  • 顺便说一句,我不清楚该代码的目的是什么,但我绝对建议使用DateTime.UtcNow 而不是DateTime.Now - 获取系统本地时区没有意义涉及以及您尝试使用的时区。

标签: c# timezone


【解决方案1】:

“Asia/Jerusalem”是IANA time zone database(又名 tzdb 或 tz 或 zoneinfo)使用的样式的 ID。 Windows 使用自己的时区 ID,这些 ID 非常不同。

如果您想以跨平台方式使用 IANA 时区,我建议使用我维护的 Noda Time project,而不是 TimeZoneInfo

此外,诸如“自纪元以来的秒数”之类的值通常时区敏感; Unix 纪元固定在 1970-01-01T00:00:00 UTC,而不是“每个时区的当地时间 1970 年 1 月 1 日午夜”。虽然这样的值可以很有用(我们在野田时代内部有这个概念)我会在使用之前仔细考虑非常。理想情况下,坚持更高级别的抽象——在 Noda Time 中,我建议使用 ZonedDateTimeInstantLocalDateTime,具体取决于您的要求。

【讨论】:

    【解决方案2】:

    我会查一下,但我猜它会调用或使用与TimeZoneInfo.GetSystemTimeZones() 相同的数据。顾名思义,并非所有时区都适用于所有计算机。

    编辑:I could confirm it。 GetSystemTimeZones 实际上是返回一个 ReadonlyCollection,它是从注册表中构建的,带有一些缓存。如果我没看错,如果你没有设置 FEATURE_WIN32_REGISTRY 标志,它就根本不存在(条件编译)。 FindSystemTimeZoneById() 具有相同的规则和限制,并且确实访问相同的缓存。

    .NET 通常会尝试使用操作系统具有的时区规则和转换。所以这个时区很可能不存在,或者以另一个名字存在。在这里,它似乎 100% 受限于 Windows 注册表所说的内容。

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 2020-12-06
      • 2022-10-13
      • 2017-12-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多