TimeZoneInfo.FindSystemTimeZoneById()在Unity应用程序

时间:2016-01-27 16:37:49

标签: c# timezone unity3d-5

如果我在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
  ...

我注意到的一个奇怪的事情是,当MSDN文档明确表示从注册表中检索信息时,会在名为“FindSystemTimeZoneByFileName”的方法中抛出异常。

2 个答案:

答案 0 :(得分:11)

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以了解区别。

更新 :正如Shaul's answer指出的那样,您现在可以使用我的TimeZoneConverter库来完成此任务。虽然不再需要上面的代码,但您现在可以简单地执行此操作:

TimeZoneInfo easternZone = TZConvert.GetTimeZoneInfo(timeZoneName);

timeZoneName参数可以 America/New_YorkEastern Standard Time

答案 1 :(得分:3)

对于记录,有一个很好的小包TimeZoneConverter,它将为您执行此操作,而不必捕获异常:

if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    timeZoneName = TZConvert.WindowsToIana(timeZoneName);
}
var zoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);