将 joda 时区映射到 windows 时区(例如在 C# 中)

mapping joda timezone to windows timezone (for example in C#)

我无法将 joda 时区映射到 windows 时区。

我使用 CLDR mappings 的 xml,它适用于大多数翻译。

然而,它没有几个 joda 时区的值:

America/Indiana/Indianapolis, BST, Australia/Victoria, Universal, Australia/NSW, America/Fort_Wayne, Africa/Asmara, America/Kentucky/Louisville, Asia/Kashgar, US/Pacific, Australia/West, Australia/Queensland, Australia/South, US/Eastern, US/Central, US/Arizona, Australia/Tasmania, NZ, US/Mountain, Australia/Eucla, GMT, Japan, CAT, Etc/GMT+0, CST, PST, EST, Australia/Canberra, Mexico/General, Israel, Canada/Eastern, Etc/GMT+9, Canada/Central, Australia/North

在哪里可以找到这些 joda 时区与 windows 时区之间的映射?

使用纯 CLDR 数据:

  • 检查 /common/bcp47/timezone.xml 文件中的区域。

    如果它不是 alias 字段中的第一个条目,则使用第一个条目。示例:

    <type name="aumel" description="Melbourne, Australia"
                       alias="Australia/Melbourne Australia/Victoria"/>
    

    您可以看到 Australia/Victoria 作为第二项,因此它是 Australia/Melbourne 的别名。请注意,CLDR 的规范区域与 TZDB 的规范定义并不完全匹配,因此请使用这些 CLDR 映射 - 而不是来自 tzdb 的 link 条目。

  • 现在检查 /common/supplemental/windowsZones.xml 文件。示例:

    <mapZone other="AUS Eastern Standard Time" territory="AU"
             type="Australia/Sydney Australia/Melbourne"/>
    

    type 字段包含一个或多个 tzdb 区域。 other 字段包含相应的 Windows 区域。

  • 请注意,并非所有 tzdb 区域都有对应的有效 Windows 区域,并且有些不是 完美 映射。

    • 不完美映射示例:America/Havana => Eastern Standard Time

      • DST 过渡日对齐,但古巴在午夜而不是凌晨 2 点过渡
    • 无法映射的区域示例:Australia/Lord_Howe

      • 存在于timezone.xml,但不存在于windowsZones.xml。
      • 此位置当前没有 Windows 时区条目。
  • 您的列表中有一些项目(BSTCATCSTPST)不是有效的 tzdb 区域,甚至 Joda-Time's list。这些可以是缩写或规则名称,但它们不是区域标识符。