2011-10-26 113 views
17

我有一個字符串,我與DateTime.strptime解析。字符串中Date的時區是CET,但Ruby創建的UTC DateTime對象當然有2小時的偏移量。Strptime與時區

目前我正在解決與DateTime.strptime().change(:offset => "+0020")問題,但我敢肯定,這不是它的工作方式。

有人能告訴我正確的方式來做到這一點嗎?

+0

如果您位於CEST/CET時區的國家/地區,則固定偏移量將不起作用。也對此感興趣,我沒有看到如何使當前時區strptime解析(但不是現在的值,正確的取決於解析的字符串)。 – tokland

回答

-1

我不能刪除接受的答案

正如@LeeJarvis在下面的評論部分中指出,Chronic.parse不接受:time_class選項。所以這個答案是越野車,雖然它看起來像它的工作原理,它沒有(除非慢性允許很快傳遞:time_class選項。)


的慢性寶石是真的很強大。

我用這樣的:

Chronic.parse("next 5:00 pm", 
:time_class => ActiveSupport::TimeZone.new(User.first.time_zone)).utc 

在我上面的例子,User.first.time_zone是 「太平洋時間(美國&加拿大)」。

慢性支持很多格式,以便檢查出來的 https://github.com/mojombo/chronic

確保傳遞:time_class選項,並轉換爲UTC(文檔中,慢性套:time_class調用解析之前,我避免使用此方法,因爲這樣可能會導致整個應用程序的其他部分不工作)

時區的文檔是在 http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

+0

這個答案不正確。 'parse()'不需要'time_class'選項。它直接在「慢性」課上設置。這將最終改變未來版本的慢性,雖然 –

+0

我的壞...我會刪除,直到此選項可用=) – Abdo

+0

呃......我不能刪除一個接受的答案。我會在上面評論。 – Abdo

9

我用它的方式如下:

ruby-1.9.2-head :001 > require 'date' 
=> true 
ruby-1.9.2-head :002 > fmt = "%m-%d-%Y %H:%M:%S %Z" 
=> "%m-%d-%Y %H:%M:%S %Z" 
ruby-1.9.2-head :003 > DateTime.strptime "10-26-2011 10:16:29 CET", fmt 
=> #<DateTime: 2011-10-26T10:16:29+01:00 (212186380589/86400,1/24,2299161)> 
ruby-1.9.2-head :004 > DateTime.strptime "10-26-2011 10:16:29 UTC", fmt 
=> #<DateTime: 2011-10-26T10:16:29+00:00 (212186384189/86400,0/1,2299161)> 
ruby-1.9.2-head :005 > DateTime.strptime "10-26-2011 10:16:29 PST", fmt 
=> #<DateTime: 2011-10-26T10:16:29-08:00 (212186412989/86400,-1/3,2299161)> 

難道你的意思?

+2

我沒有一個字符串確定我的分析字符串中的時區。它的10-26-2011 10:16:29而不是「10-26-2011 10:16:29 CET」 – Nicolas

+0

你解決了我的問題,我可以只是'「09-19-2012 11:08:44」+「 CST「'。我認爲你的答案是正確的。 – mwoods79

+0

什麼時候你進入夏令時?這個+「CST」不應該被告知嗎?根據上面的評論,如果我們能夠根據剛剛格式化的時間選擇它,那將會很好......我正在學習討厭時區。 –

0

您可以轉換日期012時區。例如:

Date.strptime('04/07/1988', '%m/%d/%Y').to_time_in_current_zone 
+3

http://apidock.com/rails/Date/to_time_in_current_zone方法折舊對不起:( – Brandt

1

我「strptiming」這個字符串:

19/05/2014 8:13:26 a.m. 

本地時間戳,這是在我的情況下,新西蘭奧克蘭,而不在字符串中時區郵票可以看出。

盡我所能告訴Time.strptime使用服務器時區作爲基礎。

在我的情況,和一般的好習慣,我的服務器在UTC時區運行,所以字符串的每個解析結束了創建一個時間對象,時間+0000(UTC):

2014-05-19 08:13:26 +0000 

然後轉換到了:

Mon, 19 May 2014 20:13:26 NZST +12:00 

其中可以看出爲12小時(UTC偏移)比實際時間,我想以後。

我試圖按照上面的方法使用+' Auckland', '...%Z'技巧,沒有任何改變。 然後我使用+ '+1200', '...%Z'技巧按照上面的正常工作。

但是我擔心夏天的時候,那麼解析會出一小時,所以這是我和finshed:

Time.strptime(call_data[:datetime].gsub(/\./, "").gsub(/am/, "AM").gsub(/pm/, "PM") + (Time.zone.now.time_zone.utc_offset/3600).to_s.ljust(4,'0').rjust(6,' +'), '%d/%m/%Y %I:%M:%S %p %Z').in_time_zone(Time.zone) 

結果:

Mon, 19 May 2014 08:13:26 NZST +12:00 

這不是特別優雅,但它的作品。

0

我一直在努力解決這個同樣的問題,試圖從窗體解析日期字符串,並保存它與服務器時間無關。我所遵循的過程就是這樣。 我保證RoR和Ruby時區設置爲UTC。如果服務器在UTC時間,它也會更容易。

我存儲的用戶語言環境中使用的ActiveSupport:像US/Eastern TimeZone的格式我有一個解釋日期功能,可以佔到日期字符串不包含本地時區或偏移

# date_str looks something like this `12/31/2014 6:22 PM` 
# tz is a string containing an ActiveSupport::TimeZone name like `US/Eastern` 
def interpret_date(date_str, tz) 
    Time.use_zone tz do 
    parsed_dt = DateTime.strptime(date_str, '%m/%d/%Y %H:%M %p') 
    offset = parsed_dt.in_time_zone(tz).utc_offset 
    parsed_dt.advance(seconds: -(offset)).in_time_zone(tz) 
    end 
end 

這當然不會覺得這是一個完美的解決方案,但它的工作原理。 以確保正確的時區的步驟如下:

  1. 解析日期字符串根據我們的格式
  2. 提取當前UTC基於在時區時間偏移(我們如果要做到這一點,你是日期解析恰好在dst中,而你的本地時間不是東部時間的dst,這將確保dst在解析的時間本地化)
  3. 將時間轉換爲我們的目標語言環境,並允許時間加上正確的偏移量
1

至少一個Rails的4.2(也許更早,沒有測試),只要您使用Time#strptime代替DateTime.strptime的S,當前時區自動應用:

> DateTime.strptime('12/28/2016 5:00 PM', '%m/%d/%Y %H:%M %p') 
=> Wed, 28 Dec 2016 17:00:00 +0000 

> Time.strptime('12/28/2016 5:00 PM', '%m/%d/%Y %H:%M %p') 
=> 2016-12-28 17:00:00 -0800 
3

這工作在Rails中5:

Time.zone.strptime("2017-05-20 18:20:10", "%Y-%m-%d %H:%M:%S") 

返回指定時區中的時間。