如何将Unix时间戳(从epoch开始的秒数)转换为Ruby DateTime?


当前回答

这将告诉您从您执行代码的那一刻起的秒数的日期。

time = Time.new + 1000000000 #date in 1 billion seconds

看跌(时间)

根据我回答问题的当前时间,它打印047-05-14 05:16:16 +0000(未来10亿秒)

或者如果你想从一个特定的时间开始数十亿秒,它的格式是时间。mktime(年、月、日、小时、分钟)

time = Time.mktime(1987,8,18,6,45) + 1000000000

放(“我会活到10亿秒”+时间)

其他回答

抱歉,是短暂的突触故障。这才是真正的答案。

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)>

最近更新:一两周前在HA服务上工作时,我对这个线程中的顶级解决方案进行了基准测试,并惊讶地发现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>

这将告诉您从您执行代码的那一刻起的秒数的日期。

time = Time.new + 1000000000 #date in 1 billion seconds

看跌(时间)

根据我回答问题的当前时间,它打印047-05-14 05:16:16 +0000(未来10亿秒)

或者如果你想从一个特定的时间开始数十亿秒,它的格式是时间。mktime(年、月、日、小时、分钟)

time = Time.mktime(1987,8,18,6,45) + 1000000000

放(“我会活到10亿秒”+时间)

DateTime。Strptime可以处理自epoch以来的秒数。该数字必须转换为字符串:

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

如果您只想要一个日期,您可以执行Date.strptime(invoice.date. Date)。To_s, '%s'),其中发票。date以anFixnum的形式出现,然后转换为String。

一个将日期时间转换为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"