【问题标题】:Where is the BCL DateTimeZoneProvider in the .NET Core implementation of NodaTime?NodaTime 的 .NET Core 实现中的 BCL DateTimeZoneProvider 在哪里?
【发布时间】:2016-11-06 13:14:14
【问题描述】:

我使用 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 时区查找?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 如果我可以强制全世界使用 IANA 时区,我会的。唉,ical.net 是一个用于创建和使用从谷歌日历、Outlook、Apple Mail 等应用程序生成的 icalendar (ics) 文件的库,因此它必须对它所支持的内容非常宽容。例如:github.com/rianjs/ical.net/blob/master/ical.NET.UnitTests/…
    • FindSystemTimeZoneById 存在:docs.microsoft.com/en-us/dotnet/core/api/… 以及 Id 属性:docs.microsoft.com/en-us/dotnet/core/api/… - 它们是否以其他方式不受支持?
    • @rianjs:嗯...它们在我之前的目标配置文件(以及 1.x 目标)中不存在。现在将使用 .Net Core 再看看......虽然我发现了一些说“在 PCL 中支持”但实际上并没有构建的东西。版本控制文档还有很多不足之处。
    • @rianjs:需要注意的一点:在 Linux 上,我希望 FindSystemTimeZoneById 仅适用于 IANA ID,而不适用于 Windows ID。他们在 Windows API 中封装了 IANA 区域。所以在这种情况下,您仍然需要 Windows 映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多