我之所以使用NodaTime是因为它对zoneinfo数据有很好的支持,但是我有一种情况,我需要将DateTimeZone转换为TimeZoneInfo以便在Quartz.NET中使用。

这里推荐的方法是什么? IANA在Windows时区和zoneinfo时区之间有一个映射文件,我可以创建一种利用此信息的扩展方法吗?

谢谢,
院长

最佳答案

如果可能的话,我会避免使用反射。我不想打赌您的方法可以与将来的版本一起使用:)

随时可以为以后的版本提交此功能的功能请求,但是目前,我将以更稳定的方式构建您的反向字典:

// Note: this version lets you work with any IDateTimeZoneSource, although as the only
// other built-in source is BclDateTimeZoneSource, that may be less useful :)
private static IDictionary<string, string> LoadTimeZoneMap(IDateTimeZoneSource source)
{
    var nodaToWindowsMap = new Dictionary<string, string>();
    foreach (var bclZone in TimeZoneInfo.GetSystemTimeZones())
    {
        var nodaId = source.MapTimeZoneId(bclZone);
        if (nodaId != null)
        {
            nodaToWindowsMap[nodaId] = bclZone.Id;
        }
    }
    return nodaToWindowsMap;
}

当然,这不会涵盖TZDB中的所有时区。实际上,它甚至都不会根据我们使用的CLDR信息提供我们可以提供的所有信息。...CLDR为每个Windows ID提供多个映射,并且目前我们仅存储第一个。我们一直在尝试找出如何公开更多信息,但是还没有解决。欢迎在Noda Time邮件列表上发表想法:)

还要注意,仅因为BCL和TZDB区域之间存在映射关系,并不意味着它们实际上将为所有内容提供相同的结果-只是可用的最接近的映射。

09-17 23:28