How to convert a unix timestamp (seconds since epoch) to Ruby DateTime?
如何将Unix时间戳(从epoch开始的秒数)转换为RubyDateTime?
抱歉,短暂的突触衰竭。这是真正的答案。
1 2 3 | require 'date' Time.at(seconds_since_epoch_integer).to_datetime |
简单示例(考虑到当前系统时区):
1 2 3 4 5 6 7 8 9 10 | $ 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):
1 2 | 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服务工作中对这个线程中的顶级解决方案进行了基准测试,并惊讶地发现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # ~ % 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 2 | require 'date' DateTime.strptime("1318996912",'%s') |
时区处理
我只是想澄清一下,尽管这已经被评论过了,所以未来的人们不会错过这个非常重要的区别。
1 | DateTime.strptime("1318996912",'%s') # => Wed, 19 Oct 2011 04:01:52 +0000 |
以UTC格式显示返回值,并要求秒为字符串并输出一个UTC时间对象,而
1 | Time.at(1318996912) # => 2011-10-19 00:01:52 -0400 |
在本地时区中显示返回值,通常需要fixnum参数,但时间对象本身仍然是UTC,即使显示不是。
因此,尽管我向两个方法传递了相同的整数,但由于类'EDOCX1[7]方法的工作方式,我似乎得到了两个不同的结果。然而,正如@eero不得不两次提醒我:
1 | Time.at(1318996912) == DateTime.strptime("1318996912",'%s') # => true |
两个返回值之间的相等比较仍然返回true。同样,这是因为值基本上是相同的(虽然不同的类,但
方法论证澄清
文档也会说"如果给定了一个数字参数,则结果是在本地时间。"这很有意义,但对我来说有点困惑,因为它们没有在文档中给出任何非整数参数的示例。因此,对于一些非整数参数示例:
1 2 | Time.at("1318996912") TypeError: can't convert String into an exact number |
不能使用字符串参数,但可以在
1 2 | Time.at(Time.new(2007,11,1,15,25,0,"+09:00")) => 2007-11-01 15:25:00 +0900 |
****编辑为在各方面不完全和完全错误****
一个命令将日期时间转换为UNIX格式,然后转换为字符串
1 2 3 4 | 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用于格式化日期
例子:
1 2 | 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 |
放(时间)
根据我现在回答的问题,它打印了dOCx1〔11〕(未来10亿秒)
或者如果你想从一个特定的时间算起十亿秒,它的格式是
1 | time = Time.mktime(1987,8,18,6,45) + 1000000000 |
Puts("我将在10亿秒前打开:"+时间)
如果你只想要一个日期,你可以做一个