コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Railsで時間において小数点以下の差分時間を取る手法

ログから処理時間が欲しいときに小数点以下で欲しいな、とか思ったときにやる方法メモ

環境

やり方

一番簡単なのは Time の型同士で引くこと。

t0 = "2018-10-10 10:00:51.14".in_time_zone
# => Wed, 10 Oct 2018 10:00:51 JST +09:00
t1 = "2018-10-10 10:00:51.25".in_time_zone 
# => Wed, 10 Oct 2018 10:00:51 JST +09:00

# わかりやすくTime型へ変換をかける
t1.to_time - t0.to_time
# => 0.11

in_time_zone に関してはこちらを参照のこと

文字列で保存する場合はiso8601メソッドがおすすめ

『開始時間と終了時間をRailsログに残して、必要なときにその始まりと終わりの差分を取ろう』とかやるときはあると思います。

ただしいその場合、Time.zone.now を 出力すると

p "Task Start - #{Time.zone.now}"
# "Task Start - 2018-10-10 15:44:34 +0900"

という形で出力されてしまう、これだと小数点以下の秒数は切り落とされてしまう、そのためログに出力した文字列からは計算できない。

丁寧に strftime でフォーマットを埋めるのも一つの方法だが、ここでおすすめなのは iso8601 を使う方法です。

# iso8601({{欲しい小数点桁数}}) で取る

p Time.zone.now.iso8601(6)
# "2018-10-10T16:00:48.193336+09:00"

これを使えば in_time_zone での変換は容易だし、strftime で逐一設定する手間が省ける。

参考リンク