我之所以使用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区域之间存在映射关系,并不意味着它们实际上将为所有内容提供相同的结果-只是可用的最接近的映射。