2015-02-08 12 views
-1

我知道很難檢測用戶的時區,因此向用戶顯示可用時區並讓他們選擇是一種最佳做法。如何處理用戶在Rails中的時區

我如何得到這爲Rails生成?

另外我會如何使用它?我是否應該將其保存爲字符串「US/Michigan」,並在我想處理某些與用戶相關的cron任務時使用某些類方法在當前服務器時間內將其轉換?

+2

你想在這裏解決什麼?這個問題似乎非常模糊。 – locoboy 2015-02-08 11:56:28

回答

0

的TZInfo寶石應該對你有所幫助:

http://www.rubydoc.info/gems/tzinfo/frames

(在Windows上,您還需要tzinfo數據來支持它,對其他操作系統的,你不應該)。

有很多時區,所以我不確定是否顯示所有這些時區的列表是最好的用戶界面。但你可以。

TZInfo::Timezone.all 

將返回所有時區爲TZInfo :: Timezone對象。 (583個物體)。爲了讓每一個時區的規範標識,你可以這樣做:

TZInfo::Timezone.all.collect(&:canonical_identifier) 

它看起來像一些規範標識的形式是「美國/紐約」,但有些則沒有。 「利比亞」,「埃及」,像「Etc/GMT + 7」這樣的技術性東西 - 所以也許你並不是真的想把它們全部展示出來。它看起來像而不是TZInfo::Timezone.all,你可以使用ZInfo::Timezone.all_country_zone_identifiers來獲得更「正常」的(仍然是418)。

您也可以選擇讓用戶先選擇國家,然後從該國家內選擇時區 - TZInfo支持按照所在國家/地區分組時區,請參閱自述文件以獲取更多信息。

我不確定這裏最好的用戶界面是什麼。如果我是你,我會盡可能多地瀏覽網站和應用,看看他們是如何做到的 - 儘管可能很難找到任何讓用戶選擇時區的方法!找出正確的用戶界面並實施它是兩個獨立的問題。但是一旦你找出你想要的用戶界面,TZInfo寶石應該給你你需要實現它的東西。

我想你可能是想首先'檢測'用戶的時區,並且只有當他們發現檢測出錯時才強迫他們選擇它。我不確定嘗試和檢測的最佳方法。我沒有使用它,但[這裏是一個Javascript庫],試圖檢測用戶的當前時區作爲標準標識符,您應該可以使用TZInfo實際轉換爲GMT或其他時區。

時區是由「美國/紐約」等字符串正式唯一標識,所以這是有意義的存儲代表時區,是的。 TZInfo會爲您提供您需要採用這些規範標識符的方法,並使用它們來獲取可用於從該時區的本地時間轉換爲GMT或服務器時間的時區對象。 (你最好在你的代碼中總是使用GMT,並在數據庫中存儲格林威治標準時間,而不是'服務器本地時間')。