web-dev-qa-db-ja.com

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

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

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

どんな助けも感謝します、ありがとう!

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

192
igul222

コード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」を使用できます。

327
David Grayson

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

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

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

66
Ryan Bigg

任意の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"
8
Nowaker

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を明確に呼び出すと、間違ったタイムスタンプが与えられます。

7
Gerry
DateTime.new(2012, 1, 15).to_time.to_i
3
wang sky