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

我知道time# to_i返回一个时间戳,但是执行dat# to_time,然后获得时间戳的结果是大约一个月(不知道为什么…)。

任何帮助都是感激的,谢谢!

编辑:好吧,我想我知道了——我在循环中多次处理一个日期,每次由于时区不匹配,日期都移动了一点,最终导致我的时间戳偏移了一个月。尽管如此,我还是想知道是否有任何方法可以在不依赖日期#to_time的情况下做到这一点。


当前回答

DateTime.new(2012, 1, 15).to_time.to_i

其他回答

DateTime.new(2012, 1, 15).to_time.to_i

代码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的方法“UTC”。

当我尝试它时,我得到以下结果:

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

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

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

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

vs

> 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显然会给出错误的时间戳。

当你有一个任意的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"