Ruby

Rubyでミリ秒表記のUNIXTIMEを日付表記に変換する

More than 3 years have passed since last update.

timestampがms表記となっているものを、通常の時刻表記にRubyで変換したいときのTipsです。

ミリ秒は1000ミリ秒が1秒ですので、1000で割れば求められますね。

しかし整数演算とすると、ミリ秒が落ちてしまうため、1000.0で割ります。

$ pry

[1] pry(main)> time = 1412915400300
=> 1412915400300
[2] pry(main)> Time.at(time / 1000.0)
=> 2014-10-10 13:30:00 +0900

Time.at(time / 1000.0).strftime('%Y/%m/%d %H:%M:%S.%3N')

=> "2014/10/10 13:30:00.299"

任意のフォーマットで日時を求めるには次のコードが使えます。

$ pry

[1] pry(main)> time = 1412915400300
=> 1412915400300
[2] pry(main)> Time.at(time / 1000.0).strftime('%Y/%m/%d %H:%M:%S')
=> "2014/10/10 13:30:00"
[3] pry(main)> Time.at(time / 1000.0).strftime('%Y/%m/%d %H:%M:%S.%3N')
=> "2014/10/10 13:30:00.299"


参考情報

%N: 秒の小数点以下。桁の指定がない場合は9桁 (ナノ秒)、%6N: マイクロ秒 (6桁)、%3N: ミリ秒 (3桁)


先ほどのコードでミリ秒精度でのフォーマットを指定すると.300ではなくが.299が返るため、次のコードを用いると良いでしょう。

$ pry

[1] pry(main)> time = 1412915400300
=> 1412915400300
[2] pry(main)> Time.at(time / 1000.0).instance_eval { '%s.%03d' % [strftime('%Y/%m/%d %H:%M:%S'), (usec / 1000.0).round] }
=> "2014/10/10 13:30:00.300"

ref. http://d.hatena.ne.jp/tetsuyai/20101029/1288354522