哪里是BCL DateTimeZoneProvider在.net核心实现的NodaTime



我使用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。(仍然有TzdbSerialization。)我在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核心,因为它不暴露调整规则:(

最新更新