TimeZoneInfo.FindSystemTimeZoneById() генерирует исключение в приложении Unity
Если я выполняю этот код в консольном приложении C#, он работает нормально.
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
Console.WriteLine(easternZone.DisplayName);
Однако, когда я использую тот же метод в приложении Unity, возникает исключение:
System.TimeZoneNotFoundException: Exception of type 'System.TimeZoneNotFoundException' was thrown.
at System.TimeZoneInfo.FindSystemTimeZoneByFileName (System.String id, System.String filepath) [0x00000] in <filename unknown>:0
at System.TimeZoneInfo.FindSystemTimeZoneById (System.String id) [0x00000] in <filename unknown>:0
...
Любопытно, что я заметил, что исключение выдается в методе с именем "FindSystemTimeZoneByFileName", когда в документации MSDN прямо говорится, что информация извлекается из реестра.
2 ответа
Приложения Unity используют Mono и могут работать с системами, отличными от Windows, поэтому информация о реестре не всегда доступна. Похоже, что Mono будет использовать любую информацию о часовых поясах, доступную в системе, будь то часовые пояса Windows или часовые пояса IANA - поэтому вам может потребоваться проверить один или другой, или оба:
TimeZoneInfo easternZone;
try
{
easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
}
catch (TimeZoneNotFoundException)
{
easternZone = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
}
Конечно, вы можете отменить их, если вы обычно собираетесь работать на платформах, отличных от Windows. Если ни один из них не найден, он все равно выдаст исключение.
Вы можете просмотреть список часовых поясов IANA здесь. Вы также можете прочитать тег вики часового пояса, чтобы понять разницу.
Обновление: Как указывалось в ответе Шаула, теперь вы можете использовать мою библиотеку TimeZoneConverter для этого. Хотя приведенный выше код больше не требуется, теперь вы можете просто сделать это:
TimeZoneInfo easternZone = TZConvert.GetTimeZoneInfo(timeZoneName);
timeZoneName
параметр может быть либо America/New_York
или же Eastern Standard Time
,
Напомним, что есть небольшой пакет TimeZoneConverter, который сделает это за вас без необходимости перехвата исключений:
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
timeZoneName = TZConvert.WindowsToIana(timeZoneName);
}
var zoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);