Rubyで現在の時刻を13桁の整数として取得するにはどうすればよいですか?


88

jQueryエポック(1970年1月1日)からのミリ秒数として現在の時刻を返すこの関数があります。

time = new Date().getTime();

Rubyで同じことをする方法はありますか?

現在、私はRubyを使用してTime.now.to_iいます。これはうまく機能しますが、10桁の整数(秒数)を返します。

のように、ミリ秒数を表示するにはどうすればよいjQueryですか?


5
これは「jQuery関数」ではなく、単なるECMAScript(javascript)です。おそらくそれが-1を促した理由ですが、少し厳しいです。
RobG 2012年

回答:


151
require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)

31
Railsユーザーへの注意:strftimeによって提供されるメソッドにActiveSupport::TimeWithZoneは、%sおよび%Q指定子は含まれていません。このメソッドDateTimeを使用して、最初にプレーンなRubyに変換する必要がありますto_datetime
ロノンフォスター2014

6
@LonnonFosterこれで動作します(Railsコンソールでテストしたばかりです)。
ニコラStojaković

こんにちは、どうすれば同じことを行うことができますが、今のところではなく、日付フィールドから行うことができますか?
2017年


100

Javascriptgettime()は、エポックからのミリ秒数を返します。

RubyTime.now.to_iは、エポックからの秒数を示します。これをに変更するとTime.now.to_f、秒が表示されますが、小数部分が含まれます。これに1,000を掛けるだけで、ミリ秒になります。次に、を使用#to_iして整数に変換します。そして、あなたは最終的に:

(Time.now.to_f * 1000).to_i

説明ありがとうございます!それでも... ...実際に正しいものとしてマークするためにどの答えを知らないこの全部に新しい
Tintin81

1
詳細については、RailsTime.nowからTime.current来ているのでRubyから来ています。したがってTime.current、Railsアプリケーションのタイムゾーンによって確認され、Time.nowサーバーのタイムゾーンを使用しています。私の経験では、Time.currentタイムゾーンの一貫性のためにRailsアプリケーションで常に使用してください
vutran 2015

1
いいえ、Time.currentここではまったく使用しないでください。構築に時間がかかります。また、すぐにUNIXタイムスタンプに変換するため、タイムゾーンの一貫性についてはまったく気にしません。(Unixタイムスタンプは常にUTCに関連しています)。つまり、99%のケースであなたの言っていることが真実ですが、これはパフォーマンス面では最後の1%に該当します。
ペルマイスター2016年

1
これは私の好ましいアプローチです。私がやりたいことの1つは、Timeクラスを拡張して:epochメソッドを追加することです。classTimedef epoch(self.to_f * 1000).to_i end end
Matt Welke 2017年

1
これはミリ秒を偽造します
brauliobo 2017年


20

を使用してstrftime、秒数を取得し、ミリ秒の小数部(または必要に応じてより小さな単位)を追加できます。

2.2.2 :001 > t = Time.new
 => 2015-06-02 12:16:56 -0700 
2.2.2 :002 > t.strftime('%s%3N')
 => "1433272616888" 

これは丸められないことに注意してください。to_fマイクロ秒で、またはマイクロ秒に達するとわかるように、切り捨てられます。

2.2.2 :003 > t.to_f
 => 1433272616.888615
2.2.2 :004 > t.usec
 => 888615 

およびto_f/to_iソリューションは、同じ問題があります。

2.2.2 :009 > (t.to_f * 1000).to_i
 => 1433272616888

あなたが本当にミリ秒精度を気にしそうだとすれば、より良い賭けであってもよいto_fround

2.2.2 :010 > (t.to_f * 1000).round
 => 1433272616889

とはいえ、ドキュメント記載されているように、「IEEE 754 doubleは、エポック以降のナノ秒数を表すのに十分な精度ではありません」。したがって、本当に気にする場合to_rは、to_f-の代わりに検討してください。

2.2.2 :011 > (t.to_r * 1000).round
 => 1433272616889 

-ただし、ミリ秒に丸めるだけであれば、おそらく問題ありません。


18

注意してください、混乱しないでください。Rubyが分数秒の概念を浮動小数点としてサポートしているという事実は、実際には浮動小数点数にはなりません。PythonでWiresharkのタイムスタンプの時間比較を行っていたときにこれに問題が発生しました... pcap-ngの時間計算が機能していませんでした。両方の整数が適切な数値を取得できたので、2つの部分(整数秒と整数ナノ秒)を処理したときだけでした。

これは、浮動小数点数に精度の問題があるためです。実際、Rubyを少し紹介すると、to_fがnsecと等しくないことがわかります。

irb(main):019:0> t=Time.now
=> 2015-04-10 16:41:35 -0500
irb(main):020:0> puts "#{t.to_f}; #{t.nsec}"
1428702095.1435847; 143584844

警告プログラマー。有効数字3桁まで安全かもしれませんが、事実は変わりません。コンピューターの浮動小数点数は概算です。最新のコンピューターのナノ秒カウンターは整数です。


より良い応答。ありがとうございました。ディレクティブ形式.strftime("%9N")も使用できます。 ruby-doc.org/core-2.3.1/Time.html#method-i-strftime
rplaurindo

13

Timeオブジェクトを取得しTime.now、呼び出すと#to_iUnixタイムスタンプ(エポックからの秒数)が返されます。 #to_fエポックからミリ秒を取得するために使用できる秒の小数部を示します。

Time.now.to_f * 1000

3
これはミリ秒を偽造します
brauliobo 2017年

0

タイプキャストInteger(1e6 * Time.now.to_f)は、ミリ秒を保持できるBignumを返します。

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