2011-10-19 125 views

回答

275

DateTime.strptime可以處理秒以來的秒數。該號碼必須轉換爲字符串:

require 'date' 
DateTime.strptime("1318996912",'%s') 
+4

這不處理小數秒 –

+28

它處理毫秒與''%Q'壽。 –

+0

謝謝@TheMiniJohn – KingChintz

541

對不起,突觸故障的短暫時刻。這是真正的答案。

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> 
+1

謝謝......下面的答案稍微簡潔一點,我找到了Time.at,但試圖找到相當於DateTime的日期。 – Tronathan

+26

這很有趣,但Time.at()。to_datetime看起來比DateTime.strptime()更令人愉快,因爲它的可讀性...至少對我而言 – tybro0103

+29

這與上面的anser不一樣,Time.at假定當前的時區, DateTime.strptime使用UTC。 –

0

如果你想只是一個日期,你可以做Date.strptime(invoice.date.to_s, '%s')其中invoice.date進來的Fixnum的形式,然後轉化爲String

+0

'Time.at(1500923406).to_date.to_s' =>'「2017-07-24」' – Chloe

36

時區處理

我只是想澄清,儘管這已被註釋,以便將來人們不要錯過這個非常重要的區別。

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 

****以各種方式****

+3

似乎合理,我已經upvoted已經(現在不能撤銷),但進一步檢查你的關於UTC的聲明是不真實的。生成的DateTime/Time對象將採用UTC與本地,是的,但在兩種情況下,原始時間戳都被解釋爲UTC格式!所以不管方法如何,時間都是平等的。在非UTC時區嘗試'Time.at(1318996912)== DateTime.strptime(「1318996912」,'%s')',你會看到! – Eero

+0

謝謝,@Eero。我會糾正這個錯誤。 – WattsInABox

+4

我很抱歉,但您糾正的錯誤仍然存​​在!:-) 運行'Time.use_zone「Samoa」do Time.at(1318996912)== DateTime.strptime(「1318996912」,'%s')end'來驗證時間是否相等,沒有LOCAL時間戳,在這兩種情況下,Unix時間戳都被解釋爲UTC。 'Time.at' *在本地時區顯示結果Time對象,'DateTime.strptime' *以UTC顯示結果DateTime對象,但無論表現如何,它們都是相等的,因爲它們是等效時刻及時。 – Eero

6

一個命令日期時間轉換爲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" 
1

這告訴你的秒數的日期在未來的那一刻起,你執行代碼。

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億秒的老上:」 +時間)

相關問題