如何将Unix时间戳(自纪元以来的秒数)转换为Ruby DateTime?
DateTime.strptime 可以处理自纪元以来的秒数 . 必须将该数字转换为字符串:
DateTime.strptime
require 'date' DateTime.strptime("1318996912",'%s')
对不起,短暂的突触失败时刻 . 这是真正的答案 .
require 'date' Time.at(seconds_since_epoch_integer).to_datetime
Brief example (这考虑了当前的系统时区):
$ 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)>
Further update (适用于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)>
Recent Update :我在一周或两周前处理HA服务时对此线程中的顶级解决方案进行了基准测试,并且惊讶地发现 Time.at(..) 优于 DateTime.strptime(..) (更新:添加了更多基准测试) .
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 Zone Handling
我只想澄清一下,即使这已被评论,所以未来的人们不要错过这个非常重要的区别 .
DateTime.strptime("1318996912",'%s') # => Wed, 19 Oct 2011 04:01:52 +0000
以UTC显示返回值,并要求秒为字符串并输出UTC时间对象,而
Time.at(1318996912) # => 2011-10-19 00:01:52 -0400
在LOCAL时区中显示返回值,通常需要一个FixNum参数,但即使显示不是,Time对象本身仍然是UTC .
因此即使我将相同的整数传递给两个方法,我看起来有两个不同的结果,因为类' #to_s 方法的工作方式 . 但是,正如@Eero不得不提醒我两次:
#to_s
Time.at(1318996912) == DateTime.strptime("1318996912",'%s') # => true
两个返回值之间的相等比较仍然返回true . 再次,这是因为值基本相同(虽然不同的类, #== 方法为您处理),但 #to_s 方法打印截然不同的字符串 . 虽然,如果我们看一下琴弦,我们可以看到它们确实是同一时间,只是印在不同的时区 .
#==
Method Argument Clarification
文档还说“如果给出了数字参数,则结果是在本地时间 . ”这是有道理的,但对我来说有点混乱,因为他们没有在文档中给出任何非整数参数的例子 . 因此,对于一些非整数参数示例:
Time.at("1318996912") TypeError: can't convert String into an exact number
你不能使用String参数,但你可以在 Time.at 中使用Time参数,它将在参数的时区中返回结果:
Time.at
Time.at(Time.new(2007,11,1,15,25,0, "+09:00")) => 2007-11-01 15:25:00 +0900
编辑在各方面都不完全和完全错误
一个命令将日期时间转换为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 (未来10亿秒)
047-05-14 05:16:16 +0000
或者如果你想从特定时间计算数十亿秒,它的格式为 Time.mktime(year, month,date,hours,minutes)
Time.mktime(year, month,date,hours,minutes)
time = Time.mktime(1987,8,18,6,45) + 1000000000
put(“我将在10亿秒之后:”时间)
如果你只想要一个日期,你可以做 Date.strptime(invoice.date.to_s, '%s') ,其中 invoice.date 以 Fixnum 的形式出现,然后转换为 String .
Date.strptime(invoice.date.to_s, '%s')
invoice.date
Fixnum
String
6 回答
DateTime.strptime
可以处理自纪元以来的秒数 . 必须将该数字转换为字符串:对不起,短暂的突触失败时刻 . 这是真正的答案 .
Brief example (这考虑了当前的系统时区):
Further update (适用于UTC):
Recent Update :我在一周或两周前处理HA服务时对此线程中的顶级解决方案进行了基准测试,并且惊讶地发现
Time.at(..)
优于DateTime.strptime(..)
(更新:添加了更多基准测试) .Time Zone Handling
我只想澄清一下,即使这已被评论,所以未来的人们不要错过这个非常重要的区别 .
以UTC显示返回值,并要求秒为字符串并输出UTC时间对象,而
在LOCAL时区中显示返回值,通常需要一个FixNum参数,但即使显示不是,Time对象本身仍然是UTC .
因此即使我将相同的整数传递给两个方法,我看起来有两个不同的结果,因为类'
#to_s
方法的工作方式 . 但是,正如@Eero不得不提醒我两次:两个返回值之间的相等比较仍然返回true . 再次,这是因为值基本相同(虽然不同的类,
#==
方法为您处理),但#to_s
方法打印截然不同的字符串 . 虽然,如果我们看一下琴弦,我们可以看到它们确实是同一时间,只是印在不同的时区 .Method Argument Clarification
文档还说“如果给出了数字参数,则结果是在本地时间 . ”这是有道理的,但对我来说有点混乱,因为他们没有在文档中给出任何非整数参数的例子 . 因此,对于一些非整数参数示例:
你不能使用String参数,但你可以在
Time.at
中使用Time参数,它将在参数的时区中返回结果:编辑在各方面都不完全和完全错误
一个命令将日期时间转换为Unix格式,然后转换为字符串
最后strftime用于格式化日期
例:
这将告诉您从执行代码开始的未来秒数 .
看跌期权(时间)
根据当前时间我正在回答问题它打印
047-05-14 05:16:16 +0000
(未来10亿秒)或者如果你想从特定时间计算数十亿秒,它的格式为
Time.mktime(year, month,date,hours,minutes)
put(“我将在10亿秒之后:”时间)
如果你只想要一个日期,你可以做
Date.strptime(invoice.date.to_s, '%s')
,其中invoice.date
以Fixnum
的形式出现,然后转换为String
.