2016-11-21 227 views
1

我很尷尬(和震驚)我找不到這樣的SO或谷歌上的好答案,請隨時指出我有一個dup,但...從時區和日期和時間創建時間對象?

我想要一個功能(在純Ruby理想,但active_support解決方案都OK),其工作原理是這樣:

輸入:一些合理的格式(例如,2016-12-25 12:00)和時區的日期時間字符串。 偏移,而是一個時區,如America/ChicagoAmerica/New_York)。例如,

make_time_in_zone('2016-12-25 12:00', 'America/Chicago') 

輸出:表示該時間精確點A TimeDateTime對象。也就是說,函數應該使用時區來考慮偏移和夏時制時間調整,以便您可以知道,例如,在America/Chicago的聖誕節中午中午UTC時間是什麼時候。

我知道我可以將時區設置爲所需的時區,創建Time對象,然後將時區設置回系統一,但我認爲這是一個不可接受的解決方案,並且需要一個實際支持此功能的函數用例。

+0

看看這對你的作品以某種方式:http://stackoverflow.com/questions/34175813/convert-string-to-date-of-specific-timezone/34176272#34176272 – Beartech

+0

不太。 'in_time_zone'完成另一個方向:準確地確定一個時間點,並告訴你它在某個時區的日期和時間。舍入到午夜,並添加招將不必總是工作,無論是(至少對於一般的情況下),因爲這取決於區和時間,'in_time_zone'可以向前移動你*或*向後 – Jonah

+0

天還沒什麼明確你要。 「......這樣你就可以知道,例如,在美國/芝加哥的聖誕節中午幾點了。」你的意思是UTC嗎?因爲在美國/芝加哥的聖誕節中午是中午。沒有意義成爲一個自作聰明,真的不理解你想要什麼。 – Beartech

回答

1

只需使用in_time_zone即可解析時區中的日期。您可以將時區作爲參數傳遞。

in_time_zone(zone = ::Time.zone) 

這將返回到你想要的。

'2016-12-25 12:00'.in_time_zone('America/Chicago') 
#=> Sun, 25 Dec 2016 12:00:00 CST -06:00 

'2016-12-25 12:00'.in_time_zone('America/New_York') 
#=> Sun, 25 Dec 2016 12:00:00 EST -05:00 
+0

這正是我正在尋找的,謝謝。 – Jonah

2

Rails的商店當前區域在當前線程,因此最正確的方法是設定解析區域。像

Time.use_zone('America/Chicago') { Time.zone.parse('2016-12-25 12:00')} 

的東西還有更多的「的hackish」的方式,但它不是公共API。

ActiveSupport::TimeZone['America/Chicago'].parse('2016-12-25 12:00') 
相關問題