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

ria*_*njs 6 c# timezone base-class-library nodatime .net-core

我用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.
}
Run Code Online (Sandbox Code Playgroud)

NodaTime 的 .NET Core 实现没有Bcl作为DateTimeZoneProvider. (它仍然有TzdbSerialization。)我在 NodaTime 源代码中摸索了一下,但我不确定替换是什么,如果有的话。

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

Jon*_*eet 4

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

TimeZoneInfo不幸的是, Noda Time 1.x 支持的 PCL 配置文件没有很好的支持 - 甚至没有提供FindSystemTimeZoneById()该属性。Id正如评论中所指出的,有令人鼓舞的迹象表明它们可能在 .NET Core 本身中 - 我需要看看。

您可以用来TzdbDateTimeZoneSource.WindowsMapping获取最近的等效 IANA/TZDB 时区...但理想情况下,如果您可以在整个代码中使用 IANA/TZDB 时区 ID 会更好。(对于其他平台来说,这些也将更加便携。)

即使在 .NET Core 上受支持,如果您使用的是 Linux,FindSystemTimeZoneById它也不会提供Windowszoneinfo时区 - 它会使用这些文件。因此,如果您需要 Windows 时区可移植性,我认为WindowsMapping确实是最好的选择。

更新:刚刚又看了一遍,我们肯定不能在.NET Core中支持TimeZoneInfo,因为它没有公开调整规则:(