Ruby / Rails:日付をUNIXタイムスタンプに変換する


202

RailsアプリのDateオブジェクトからUNIXタイムスタンプ(1970 GMTからの秒数)を取得するにはどうすればよいですか?

Time#to_iタイムスタンプが返されることはわかっていますが、タイムスタンプDate#to_timeを取得して取得すると、約1か月ずれた結果になります(理由はわかりません...)。

助けてくれてありがとう、ありがとう!

編集:わかりました、私はそれを理解したと思います-ループで数回日付を処理していて、タイムゾーンの不一致のために日付が少しずつ移動されるたびに、最終的にタイムスタンプが1か月ずれる結果になりました。それでも、に依存せずにこれを行う方法があるかどうかを知りたいと思いますDate#to_time

回答:


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たぶん彼の言ったことです。
Adam Eberlin 2013

3
Railsでは、ActiveSupportを介して、DateTimeインスタンスにutc()メソッド(getutcにもエイリアス)があります
Gokul

71

試してみると次のようになります。

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

これら2つの数値の違いDateは、が現在の時間の時間、分、または秒を格納しないためです。a Dateをaに変換すると、Timeその日の真夜中になります。


9

ローカルタイムオフセットを使用to_utcまたはutc修正するための推奨オプションが機能しません。私にとっては使用が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"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.