Noda Time 2.0中的MapTimeZoneId等效于什么?

4

我已经使用以下代码一段时间了,一直没有问题:

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函数已经不存在了。请问如何让这个函数重新工作起来?

1
主版本号会因为某些原因而增加。查看新版本的文档并学习如何使用新类型。 - zerkms
@zerkms - 我是通过查看这里来完成的。它根本没有提到这种方法。 - Icemanind
http://nodatime.org/2.0.x/api/NodaTime.TimeZones.TzdbDateTimeZoneSource.html --- 在v2中没有这样的方法。 - zerkms
@zerkms - 对的。我知道那个方法已被删除。我想问的是如何获得以前相同的功能。例如,有什么替代方法吗? - Icemanind
1
很好。但是我不确定为什么你没有阅读文档或源代码。我只用了15秒钟就找到了https://github.com/nodatime/nodatime/commit/3599643da4f53988c95b272a23f7fe7aa5682cb5 - zerkms
显示剩余7条评论
1个回答

11

目前,您需要与 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,因此在大多数情况下这段代码将返回null

我已提出一个问题来解决这个迁移指南中没有提到的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接