2016-01-27 4 views
3

Если я выполняю этот код в консольном приложении C#, он отлично работает.TimeZoneInfo.FindSystemTimeZoneById() выдает исключение в приложении Unity

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 явно говорится, что информация извлекается из реестра.

ответ

7

Приложения Unity используют Mono и могут настраивать таргетинг на системы, отличные от Windows, поэтому данные реестра не всегда доступны. Похоже, что Mono будет использовать любую информацию о часовом поясе в системе, будь то временные зоны Windows или временные зоны IANA - поэтому вам может потребоваться проверить один или другой, или оба:

TimeZoneInfo easternZone; 

try 
{ 
    easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
} 
catch (TimeZoneNotFoundException) 
{ 
    easternZone = TimeZoneInfo.FindSystemTimeZoneById("America/New_York"); 
} 

Конечно, вы можете отменить их, если вы обычно работаете на платформах, отличных от Windows. Если ни один из них не найден, он все равно будет выдавать исключение.

Вы можете посмотреть the list of IANA time zones here. Вы также можете прочитать the timezone tag wiki, чтобы понять различие.

+0

Большое спасибо за ваш быстрый ответ и ссылки, которые вы предоставили. Я был очень уверен, что это решит проблему, но, к сожалению, этого не произошло. Фактически, я понял, что даже не могу получить список доступных часовых поясов, используя 'TimeZoneInfo.GetSystemTimeZones()'. Я предполагаю, что проблема не только в Mono, но и что-то еще, связанное с Unity или любой другой библиотекой, которую мы используем в проекте. Я продолжу копать, –

+1

Я потратил еще некоторое время на эту проблему и обнаружил, что на самом деле это ошибка Unity, как сообщается здесь: https://issuetracker.unity3d.com/issues/win-system- dot-timezoneinfo-do-not-return-any-time-зоны –

+0

Спасибо за продолжение. Сообщите нам, исправят ли они это. :) –