2016-07-04 8 views
3

Я использую NodaTime для преобразования часовых поясов в ical.net, потому что он работает намного лучше, чем предыдущая реализация, которая пыталась использовать элемент VTIMEZONE для обработки изменений времени и преобразования часовых поясов.Где находится BCL DateTimeZoneProvider в реализации .NET Core для NodaTime?

Под капотом этот метод очень важен для производительности: он сокращает время выполнения тестового набора от около 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. 
} 

Реализация ядра .NET из NodaTime не Bcl как DateTimeZoneProvider. (У него все еще есть Tzdb и Serialization.) Я немного толкнул в источнике NodaTime, но я не был уверен, что замена должна была быть, если таковая имеется.

Что мы должны использовать для поиска по часовому поясу BCL в порту .NET Core NodaTime?

ответ

2

Что мы должны использовать для поиска часовых поясов BCL в порту .NET Core NodaTime?

К сожалению, не существует хорошая поддержка TimeZoneInfo в профиле PCL, что Нода Time 1.x поддерживает - даже FindSystemTimeZoneById() и Id собственности не предусмотрено. Как отмечается в комментариях, есть обнадеживающие признаки того, что они могут быть в самом .NET Core - мне нужно будет посмотреть.

Вы можете использовать TzdbDateTimeZoneSource.WindowsMapping, чтобы получить ближайший эквивалентный часовой пояс IANA/TZDB ... но в идеале было бы лучше, если бы вы могли использовать идентификаторы часовых поясов IANA/TZDB в вашем коде. (Те, кто будет более переносимым для других платформ, тоже.)

Даже если FindSystemTimeZoneById поддерживается на .NET Ядра, он не будет предоставлять для Windows часовых поясов, если вы на Linux - он использует zoneinfo файлы , Поэтому, если вам нужна переносимость часового пояса Windows, я думаю, что WindowsMapping действительно лучший вариант.

Update: Только что посмотрел снова, мы определенно не может поддержку TimeZoneInfo в .NET Ядра, так как она не раскрывает правила коррекции :(

+0

Если бы я мог санкционировать, что весь мир с помощью часовых поясов IANA , Я бы ... Увы, ical.net - это библиотека для создания и потребления файлов icalendar (ics), созданных из таких приложений, как Google Calendar, Outlook, Apple Mail и т. Д., Поэтому она должна быть довольно разрешительной в том, что она поддерживает. Например: https : //github.com/rianjs/ical.net/blob/master/ical.NET.UnitTests/Calendars/Serialization/TimeZone3.ics#L5 – rianjs

+0

FindSystemTimeZoneById существует: https://docs.microsoft.com/en-us/ dotnet/core/api/system.timezoneinfo # System_TimeZoneInfo_FindSystemTimeZoneById_System_String_, как и I d: https://docs.microsoft.com/en-us/dotnet/core/api/system.timezoneinfo#System_TimeZoneInfo_Id - они не поддерживаются каким-либо другим способом? – rianjs

+0

@rianjs: Хм ... они не существовали в предыдущих профилях, на которые я нацелился (и на эту цель 1.x). У вас будет еще один взгляд на .Net Core ... хотя я нашел несколько вещей, которые говорят «поддерживается в PCL», но потом фактически не строятся. Документы для управления версиями оставляют желать лучшего. –