我有一個字符串,我與DateTime.strptime
解析。字符串中Date的時區是CET,但Ruby創建的UTC DateTime對象當然有2小時的偏移量。Strptime與時區
目前我正在解決與DateTime.strptime().change(:offset => "+0020")
問題,但我敢肯定,這不是它的工作方式。
有人能告訴我正確的方式來做到這一點嗎?
我有一個字符串,我與DateTime.strptime
解析。字符串中Date的時區是CET,但Ruby創建的UTC DateTime對象當然有2小時的偏移量。Strptime與時區
目前我正在解決與DateTime.strptime().change(:offset => "+0020")
問題,但我敢肯定,這不是它的工作方式。
有人能告訴我正確的方式來做到這一點嗎?
我不能刪除接受的答案
正如@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
我用它的方式如下:
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)>
難道你的意思?
您可以轉換日期012時區。例如:
Date.strptime('04/07/1988', '%m/%d/%Y').to_time_in_current_zone
http://apidock.com/rails/Date/to_time_in_current_zone方法折舊對不起:( – Brandt
我「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
這不是特別優雅,但它的作品。
我一直在努力解決這個同樣的問題,試圖從窗體解析日期字符串,並保存它與服務器時間無關。我所遵循的過程就是這樣。 我保證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
這當然不會覺得這是一個完美的解決方案,但它的工作原理。 以確保正確的時區的步驟如下:
至少一個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
這工作在Rails中5:
Time.zone.strptime("2017-05-20 18:20:10", "%Y-%m-%d %H:%M:%S")
返回指定時區中的時間。
如果您位於CEST/CET時區的國家/地區,則固定偏移量將不起作用。也對此感興趣,我沒有看到如何使當前時區strptime解析(但不是現在的值,正確的取決於解析的字符串)。 – tokland