NodaTime的.NET Core实现中的BCL DateTimeZoneProvider在哪里?

时间:2016-07-04 19:06:21

标签: c# timezone .net-core nodatime base-class-library

我使用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。 (它仍然有TzdbSerialization。)我在NodaTime资源中捅了一下,但是我不确定替换是什么意思,如果有的话。

我们应该在NodaTime的.NET Core端口中使用什么来进行BCL时区查找?

1 个答案:

答案 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,因为它没有公开调整规则:(