2017-10-19 121 views
0

我的Xamarin格式的iOS和Android是大量使用设备的时间和需要设置使用不同的时间在其他国家。Xamarin格式:安全使用时区列出使用GetSystemTimeZones

我做了搜索,发现此列出所有可用的时区:

foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones()) 
      Console.WriteLine(z.Id); 

我的方案,用户可以选择任何网站,并设置正确的时区基础上,他们的网站是这样的时间将显示相对于他们选择的网站。

我运行了代码并且至少使用了所有可用的时区。看起来像iOS和Android有不同的时区标识。我认为是因为不同的系统。

我只是担心时区编号没有完全列出因为我们的应用程序在国际上运行,实际上大多数应用程序在国际上运行。

var utcTime = DateTime.UtcNow; 
     var zone = TimeZoneInfo.FindSystemTimeZoneById("Hongkong"); 
     var zoneTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, zone); 
     System.Diagnostics.Debug.WriteLine("Device Timezone : " + DateTime.Now + " " + TimeZone.CurrentTimeZone.StandardName); 
     System.Diagnostics.Debug.WriteLine("Hong Kong Time : " + zoneTime.ToString("G")); 

另一个注意事项:上面的代码是否也照顾到了节电?例如在新西兰,每年新西兰不得不将时间推移或背景时间缩短一小时,而其他国家则不然。

+1

你可能想看'野田时间'(http://nodatime.org),你也应该阅读https://stackoverflow.com/a/2532962/4984832 – SushiHangover

+0

如果你使用上面的代码,你会解释这个问题吗?而不是你提出的nodatime?在我的iOS上,我将日期更改回到五月,这会返回一小时并显示时间,时间返回是正确的,例如10月(现在):10点nz时间和5点hk时间。 5月,10:00 nz时间和6:00 – LittleFunny

+0

目前还不清楚你如何使用UTC时间与本地TZ转换时间(现在在你的问题中使用,在你的评论中使用的是前一个UTC时间),而时区不是与偏移相同。如果您正在计划“本地”事件,请使用本地时间,其中包括偏移量vs.UTC时间,因为差异取决于将来何时发生,并且将UTC转换回本地时间会导致与原始请求不同的本地时间。阅读链接的SO回答和评论,因为它涵盖了这些主题。 (我建议审查野田,因为它消除了这种困惑)。 – SushiHangover

回答

0

TimeZoneInfo.GetSystemTimeZones()确实如此 - 获取运行系统上可用的时区。一般来说,不能认为所有系统都安装了相同的时区。

假设所有系统都是Windows桌面计算机会更安全一些,但即使这样,它也将取决于这些计算机是否随时更新最新的时区更改(通过Windows Update中的Windows更新和操作系统版本提供) 。

在跨平台的世界里,所有的投注都关闭了。您可能会获得Windows时区ID。您可能会获得IANA时区ID。你可能会得到别的东西。

您展示了一个"Hongkong"的示例。这确实是IANA时区数据库中的"Asia/Hong_Kong"的有效别名。因此,您的环境可能会提供IANA ID。 (但您应该更喜欢"Asia/Hong_Kong"。)

如果您认为可能需要在IANA和Windows时区之间进行转换,则可以使用我的TimeZoneConverter库。但是,就您的情况而言,似乎使用​​会更安全,因为它会将时区数据与您的应用程序捆绑在一起,而不是依赖操作系统来提供数据。

是的,该代码可以正确处理夏令时。对于新西兰,您将使用"Pacific/Auckland"作为IANA时区ID。但是,您应该选择TimeZoneInfo.Local.StandardNameTimeZoneInfo.DaylightName,具体取决于TimeZoneInfo.IsDaylightSavingTime的结果。或者,如果您想要更准确和本地化的名称,则可以使用我的TimeZoneNames库。