TimeZoneInfo.FindSystemTimeZoneById()在Unity应用程序中抛出exception
如果我在C#控制台应用程序中执行此代码,它可以正常工作。
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); Console.WriteLine(easternZone.DisplayName);
但是,当我在Unity应用程序中使用相同的方法时,会抛出exception:
System.TimeZoneNotFoundException: Exception of type 'System.TimeZoneNotFoundException' was thrown. at System.TimeZoneInfo.FindSystemTimeZoneByFileName (System.String id, System.String filepath) [0x00000] in :0 at System.TimeZoneInfo.FindSystemTimeZoneById (System.String id) [0x00000] in :0 ...
我注意到一个奇怪的事情是,当MSDN文档明确表示从注册表中检索信息时,会在名为“FindSystemTimeZoneByFileName”的方法中抛出exception。
Unity应用程序使用Mono,可以定位非Windows系统 – 因此注册表信息并不总是可用。 似乎Mono将使用系统上可用的任何时区信息,无论是恰好是Windows时区还是IANA时区 – 因此,您可能需要检查其中一个或两个,或两者:
TimeZoneInfo easternZone; try { easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); } catch (TimeZoneNotFoundException) { easternZone = TimeZoneInfo.FindSystemTimeZoneById("America/New_York"); }
当然,如果您通常要在非Windows平台上运行,则可以撤消这些操作。 如果两者都找不到,那么它仍会抛出exception。
您可以在此处查看IANA时区列表 。 您可能还想阅读时区标签wiki以了解区别。
更新 :正如Shaul的回答所指出的,您现在可以使用我的TimeZoneConverter库来完成此任务。 虽然不再需要上面的代码,但您现在可以简单地执行此操作:
TimeZoneInfo easternZone = TZConvert.GetTimeZoneInfo(timeZoneName);
timeZoneName
参数可以是America/New_York
或Eastern Standard Time
。
为了记录,有一个很好的小包名为TimeZoneConverter ,它将为您执行此操作,而不必捕获exception:
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { timeZoneName = TZConvert.WindowsToIana(timeZoneName); } var zoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);