Ruby / Rails:将日期转换为UNIX时间戳


202

我如何从Rails应用程序中的Date对象获取UNIX时间戳(自1970 GMT以来的秒数)?

我知道会Time#to_i返回一个时间戳,但是执行Date#to_time然后获取时间戳会导致大约一个月的时间偏差(不确定原因...)。

任何帮助表示赞赏,谢谢!

编辑:好的,我想我已经弄明白了-我正在循环处理几次日期,并且每次由于时区不匹配而将日期移动了一点,最终导致我的时间戳记有一个月的间隔。不过,我仍然想知道是否有任何方法可以不依赖来执行此操作Date#to_time

Answers:


350

该代码date.to_time.to_i应该可以正常工作。下面的Rails控制台会话显示了一个示例:

>> Date.new(2009,11,26).to_time
=> Thu Nov 26 00:00:00 -0800 2009
>> Date.new(2009,11,26).to_time.to_i
=> 1259222400
>> Time.at(1259222400)
=> Thu Nov 26 00:00:00 -0800 2009

请注意,中间的DateTime对象位于本地时间,因此时间戳可能会比您期望的晚几个小时。如果要在UTC时间工作,可以使用DateTime的方法“ to_utc”。


3
DateTime没有to_utc
绿色

12
date.to_time.utc可能就是他的意思。
亚当·埃伯林

3
在Rails中,通过ActiveSupport,DateTime实例确实具有utc()方法(也别名为getutc)
Gokul

71

尝试时得到以下信息:

>> Date.today.to_time.to_i
=> 1259244000
>> Time.now.to_i
=> 1259275709

这两个数字之间的差异是由于Date未存储当前时间的小时,分​​钟或秒。将a转换Date为a Time将导致当天的午夜。


9

使用to_utcutc修复本地时间偏移的建议选项不起作用。对我来说,我发现使用Time.utc()工作正常,并且代码涉及的步骤更少:

> Time.utc(2016, 12, 25).to_i
=> 1482624000 # correct

> Date.new(2016, 12, 25).to_time.utc.to_i
=> 1482584400 # incorrect

这是在使用Date... 后调用utc时发生的情况。

> Date.new(2016, 12, 25).to_time
=> 2016-12-25 00:00:00 +1100 # This will use your system's time offset
> Date.new(2016, 12, 25).to_time.utc
=> 2016-12-24 13:00:00 UTC

...如此明确地打电话to_i将给错误的时间戳。


8

当您有一个任意的DateTime对象时,Ruby 1.8的解决方案:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.