什么是 MapTimeZoneId 的 Noda Time 2.0 等价物?

What's the Noda Time 2.0 equivalent of MapTimeZoneId?

我使用以下代码已经有一段时间了:

internal static string WindowsToIana(string windowsZoneId)
{
    if (windowsZoneId.Equals("UTC", StringComparison.Ordinal))
        return "Etc/UTC";

    var tzdbSource = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default;
    var tzi = TimeZoneInfo.FindSystemTimeZoneById(windowsZoneId);
    if (tzi == null) return null;
    var tzid = tzdbSource.MapTimeZoneId(tzi);
    if (tzid == null) return null;
    return tzdbSource.CanonicalIdMap[tzid];
}

将 NodaTime 升级到 2.0 版时,我现在收到一个编译时错误,提示 MapTimeZoneId 不再存在。如何让这个功能再次运行?

目前,您需要 Noda Time 内部存在的相同代码,但不是很多:

internal static string WindowsToIana(string windowsZoneId)
{
    // Avoid UTC being mapped to Etc/GMT, which is the mapping in CLDR
    if (windowsZoneId == "UTC")
    {
        return "Etc/UTC";
    }
    var source = TzdbDateTimeZoneSource.Default;
    string result;
    // If there's no such mapping, result will be null.
    source.WindowsMapping.PrimaryMapping.TryGetValue(windowsZoneId, out result);
    // Canonicalize
    if (result != null)
    {
        result = source.CanonicalIdMap[result];
    }
    return result;
}

备注:

  • 此代码适用于无论出于何种原因不存在于您的系统中但存在于 CLDR
  • 中的时区 ID
  • 如果这是 全部 你正在用 Noda Time 做,考虑使用 TimeZoneConverter 而不是
  • 如果您 运行 在非 Windows 系统上的 .NET Core 上,TimeZoneInfo.Local.Id 可能已经是 IANA ID,因此此代码将 return null 在大多数情况下。

我已提交 an issue 以处理迁移指南中未提及的事实。