我使用NodaTime在ical.net中进行时区转换,因为它的性能比之前尝试使用VTIMEZONE
元素处理时间更改和时区转换的实现要好得多。
在幕后,这种方法对性能非常重要:它将测试套件的运行时间从大约6秒降低到大约2.5秒。
public static DateTimeZone GetZone(string tzId)
{
// IANA lookup attempt
zone = DateTimeZoneProviders.Bcl.GetZoneOrNull(tzId);
if (zone != null)
{
return zone;
}
// Serialization lookup attempt
// Some other tricks to find a reasonable time zone, etc.
}
NodaTime的.NET Core实现没有Bcl
作为DateTimeZoneProvider
。 (它仍然有Tzdb
和Serialization
。)我在NodaTime资源中捅了一下,但是我不确定替换是什么意思,如果有的话。
我们应该在NodaTime的.NET Core端口中使用什么来进行BCL时区查找?
答案 0 :(得分:3)
我们应该在NodaTime的.NET Core端口中使用什么来进行BCL时区查找?
不幸的是,Noda Time 1.x支持的PCL配置文件中没有良好的TimeZoneInfo
支持 - 甚至FindSystemTimeZoneById()
和Id
属性也未提供。正如评论中所指出的,有令人鼓舞的迹象表明它们可能存在于.NET Core本身 - 我需要查看。
您可以使用TzdbDateTimeZoneSource.WindowsMapping
来获取最近的等效IANA / TZDB时区...但理想情况下,如果您可以在整个代码中使用IANA / TZDB时区ID,那会更好。 (对于其他平台来说,这些也更便携。)
即使.NET Core支持FindSystemTimeZoneById
,如果您使用Linux,它也无法提供 Windows 时区 - 它使用{{1文件。因此,如果您需要Windows时区可移植性,我认为zoneinfo
确实是最佳选择。
更新:刚看了一遍,我们肯定无法支持.NET Core中的WindowsMapping
,因为它没有公开调整规则:(