我使用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.
}
nodeatime的。net核心实现没有Bcl
作为DateTimeZoneProvider
。(仍然有Tzdb
和Serialization
。)我在nodeatime源代码中戳了一下,但我不确定替换意味着什么,如果有的话。
我们应该使用什么BCL时区查找在。net核心端口的NodaTime?
我们应该使用什么BCL时区查找在。net核心端口的NodaTime?
不幸的是,在Noda Time 1的PCL配置文件中没有很好的TimeZoneInfo
支持。x支持-甚至不提供FindSystemTimeZoneById()
和Id
属性。正如评论中所指出的,有令人鼓舞的迹象表明,它们可能在。net Core本身中——我需要看看。
您可以使用TzdbDateTimeZoneSource.WindowsMapping
获得最接近的等效IANA/TZDB时区…但理想情况下,最好在整个代码中使用IANA/TZDB时区id。(这些在其他平台上也更易于移植。)
即使。net Core支持FindSystemTimeZoneById
,如果你在Linux上,它也不会提供Windows时区——它使用zoneinfo
文件。因此,如果您需要Windows时区可移植性,我认为WindowsMapping
确实是最好的选择。
更新:刚刚看了一遍,我们肯定不能支持TimeZoneInfo
在。net核心,因为它不暴露调整规则:(