2017-10-19 83 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庫。