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. (它仍然有Tzdb和Serialization。)我在 NodaTime 源代码中摸索了一下,但我不确定替换是什么,如果有的话。
我们应该在 NodaTime 的 .NET Core 端口中使用什么进行 BCL 时区查找?
我们应该在 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,因为它没有公开调整规则:(