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

igu*_*222 197 ruby timestamp ruby-on-rails date

如何从Rails应用程序中的Date对象获取UNIX时间戳(自格林威治标准时间1970年以来的秒数)?

我知道Time#to_i返回一个时间戳,但是执行Date#to_time然后获取时间戳会导致大约一个月的时间(不知道为什么......).

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

编辑:好的,我想我想出来了 - 我在一个循环中多次处理一个日期,每次由于时区不匹配而移动一点日期,最终导致我的时间戳缩短一个月.不过,我仍然有兴趣知道是否有任何方法可以不依赖于此Date#to_time.

Dav*_*son 339

代码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
Run Code Online (Sandbox Code Playgroud)

请注意,中间DateTime对象是本地时间,因此时间戳可能比您预期的几个小时.如果要在UTC时间工作,可以使用DateTime的方法"to_utc".

  • `date.to_time.utc`可能就是他的意思. (12认同)
  • DateTime没有`to_utc` (3认同)
  • 在Rails中,通过ActiveSupport,DateTime实例确实有一个utc()方法(也有别名为getutc) (3认同)

Rya*_*igg 68

我尝试时得到以下内容:

>> Date.today.to_time.to_i
=> 1259244000
>> Time.now.to_i
=> 1259275709
Run Code Online (Sandbox Code Playgroud)

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


Now*_*ker 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"
Run Code Online (Sandbox Code Playgroud)


Ger*_*rry 8

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

> Time.utc(2016, 12, 25).to_i
=> 1482624000 # correct
Run Code Online (Sandbox Code Playgroud)

VS

> Date.new(2016, 12, 25).to_time.utc.to_i
=> 1482584400 # incorrect
Run Code Online (Sandbox Code Playgroud)

以下是使用后调用utc时发生的情况Date....

> 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
Run Code Online (Sandbox Code Playgroud)

......所以很明显,呼叫to_i会给出错误的时间戳.