如何將Unix時間戳記(自epoch以來的秒數)轉換爲Ruby DateTime?如何將unix時間戳(自epoch以來的秒數)轉換爲Ruby DateTime?
回答
DateTime.strptime
可以處理秒以來的秒數。該號碼必須轉換爲字符串:
require 'date'
DateTime.strptime("1318996912",'%s')
對不起,突觸故障的短暫時刻。這是真正的答案。
require 'date'
Time.at(seconds_since_epoch_integer).to_datetime
附圖示例(這考慮了當前系統時區):
$ date +%s
1318996912
$ irb
ruby-1.9.2-p180 :001 > require 'date'
=> true
ruby-1.9.2-p180 :002 > Time.at(1318996912).to_datetime
=> #<DateTime: 2011-10-18T23:01:52-05:00 (13261609807/5400,-5/24,2299161)>
此外更新(對於UTC):
ruby-1.9.2-p180 :003 > Time.at(1318996912).utc.to_datetime
=> #<DateTime: 2011-10-19T04:01:52+00:00 (13261609807/5400,0/1,2299161)>
最近更新:我在一個醫管局工作的同時,在這個主題中測試了頂級解決方案服務一兩個星期前,並驚訝地發現Time.at(..)
勝過DateTime.strptime(..)
(更新:增加了更多的基準)。
# ~ % ruby -v
# => ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin13.0]
irb(main):038:0> Benchmark.measure do
irb(main):039:1* ["1318996912", "1318496912"].each do |s|
irb(main):040:2* DateTime.strptime(s, '%s')
irb(main):041:2> end
irb(main):042:1> end
=> #<Benchmark ... @real=2.9e-05 ... @total=0.0>
irb(main):044:0> Benchmark.measure do
irb(main):045:1> [1318996912, 1318496912].each do |i|
irb(main):046:2> DateTime.strptime(i.to_s, '%s')
irb(main):047:2> end
irb(main):048:1> end
=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>
irb(main):050:0* Benchmark.measure do
irb(main):051:1* ["1318996912", "1318496912"].each do |s|
irb(main):052:2* Time.at(s.to_i).to_datetime
irb(main):053:2> end
irb(main):054:1> end
=> #<Benchmark ... @real=1.5e-05 ... @total=0.0>
irb(main):056:0* Benchmark.measure do
irb(main):057:1* [1318996912, 1318496912].each do |i|
irb(main):058:2* Time.at(i).to_datetime
irb(main):059:2> end
irb(main):060:1> end
=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>
如果你想只是一個日期,你可以做Date.strptime(invoice.date.to_s, '%s')
其中invoice.date
進來的Fixnum
的形式,然後轉化爲String
。
'Time.at(1500923406).to_date.to_s' =>'「2017-07-24」' – Chloe
時區處理
我只是想澄清,儘管這已被註釋,以便將來人們不要錯過這個非常重要的區別。
DateTime.strptime("1318996912",'%s') # => Wed, 19 Oct 2011 04:01:52 +0000
顯示在UTC一個返回值並需要秒爲字串,並輸出UTC時間對象,而
Time.at(1318996912) # => 2011-10-19 00:01:52 -0400
顯示本地時區中的返回值,通常需要一個Fixnum參數,但時間對象本身仍然在UTC,即使顯示不是。
因此,即使我將同一個整數傳遞給兩個方法,由於類'#to_s
方法的工作方式,我看起來有兩個不同的結果。但@Eero不得不提醒我兩次:
Time.at(1318996912) == DateTime.strptime("1318996912",'%s') # => true
兩個返回值之間的等同比較仍然返回true。同樣,這是因爲值基本相同(雖然不同的類,#==
方法爲您照顧),但#to_s
方法打印截然不同的字符串。雖然,如果我們看看這些琴絃,我們可以看到他們確實是同一時間,只是印在不同的時區。
方法參數澄清
該文檔也說:「如果一個數字參數了,其結果是在本地時間。」這是有道理的,但對我來說有點困惑,因爲他們沒有給出文檔中任何非整數參數的例子。因此,對於一些非整數參數的例子:
Time.at("1318996912")
TypeError: can't convert String into an exact number
你不能用一個字符串參數,但你可以使用時間參數爲Time.at
,它會在參數的時區返回結果:
Time.at(Time.new(2007,11,1,15,25,0, "+09:00"))
=> 2007-11-01 15:25:00 +0900
****以各種方式****
似乎合理,我已經upvoted已經(現在不能撤銷),但進一步檢查你的關於UTC的聲明是不真實的。生成的DateTime/Time對象將採用UTC與本地,是的,但在兩種情況下,原始時間戳都被解釋爲UTC格式!所以不管方法如何,時間都是平等的。在非UTC時區嘗試'Time.at(1318996912)== DateTime.strptime(「1318996912」,'%s')',你會看到! – Eero
謝謝,@Eero。我會糾正這個錯誤。 – WattsInABox
我很抱歉,但您糾正的錯誤仍然存在!:-) 運行'Time.use_zone「Samoa」do Time.at(1318996912)== DateTime.strptime(「1318996912」,'%s')end'來驗證時間是否相等,沒有LOCAL時間戳,在這兩種情況下,Unix時間戳都被解釋爲UTC。 'Time.at' *在本地時區顯示結果Time對象,'DateTime.strptime' *以UTC顯示結果DateTime對象,但無論表現如何,它們都是相等的,因爲它們是等效時刻及時。 – Eero
一個命令日期時間轉換爲Unix格式編輯的不完全和完全不正確的,然後串
DateTime.strptime(Time.now.utc.to_i.to_s,'%s').strftime("%d %m %y")
Time.now.utc.to_i #Converts time from Unix format
DateTime.strptime(Time.now.utc.to_i.to_s,'%s') #Converts date and time from unix format to DateTime
最後的strftime來格式化日期
例子:
irb(main):034:0> DateTime.strptime("1410321600",'%s').strftime("%d %m %y")
"10 09 14"
這告訴你的秒數的日期在未來的那一刻起,你執行代碼。
time = Time.new + 1000000000 #date in 1 billion seconds
看跌期權(時間)
根據當前的時間,我回答這個問題它打印047-05-14 05:16:16 +0000
(1十億秒後的未來)
,或者如果你想從一個特定的數十億秒時間,它在格式Time.mktime(year, month,date,hours,minutes)
time = Time.mktime(1987,8,18,6,45) + 1000000000
看跌期權(「我是10億秒的老上:」 +時間)
- 1. 自Unix時代以來,將時間戳記轉換爲秒數
- 2. 如何將GMT時間轉換爲EPOCH時間戳以毫秒爲單位?
- 3. 將datetime轉換爲unix時間戳
- 4. 將Unix時間戳轉換爲MySQL DATETIME
- 5. MySQL將datetime轉換爲Unix時間戳
- 6. 將epoch/unix轉換爲日期時間
- 7. 將時間戳轉換爲自世紀以來的毫秒數
- 8. 將EPOCH時間戳轉換爲日期
- 9. 如何將Unix時間戳轉換爲DateTime,反之亦然?
- 10. 如何將時間戳轉換爲自午夜以來的秒數?
- 11. 如何將時間戳轉換爲php中的unix時間戳?
- 12. 將時間轉換爲Unix時間戳
- 13. 如何將1970年以來的C/unix整數日期時間以秒爲單位轉換爲Delphi中的DateTime?
- 14. 接收UNIX時間戳和轉換時間,以毫秒WP7
- 15. 如何在UNIX中將UNIX時間戳轉換爲EST時間?
- 16. 如何將Unix Epoch時間轉換爲Windows C++中的PST?
- 17. 如何將epoch時間戳轉換爲hive中的PST日期
- 18. 將UNIX時間戳轉換爲系列的pandas.tslib.Timestamp和datetime
- 19. 如何將時間戳從十六進制格式轉換爲EPOCH時間戳?
- 20. 如何在Tableau中將unix-epoch轉換爲人類時間?
- 21. 轉換秒,在C++ UNIX時間戳
- 22. 將Unix時間戳轉換爲時區?
- 23. 轉換日期爲Unix時間(自1970年以來秒)
- 24. 如何將日期時間轉換爲自1970年以來的秒數?
- 25. 如何將Etc/GMT + 2時區中的時間戳轉換爲unix時間戳?
- 26. PHP-MYSQL:將Unix時間戳轉換爲DateTime,反之亦然
- 27. MySQL視圖:將unix時間戳轉換爲datetime
- 28. Perl將本地時間轉換爲unix(epoch)時間
- 29. 將unix時間轉換爲UTC datetime
- 30. 如何將時間戳轉換爲帶有時區的秒數
這不處理小數秒 –
它處理毫秒與''%Q'壽。 –
謝謝@TheMiniJohn – KingChintz