Ruby Advent Calendar jp: 2010 の 18 日目です。前日は mat_aki さんでした。
細かい話をしよう。あれは今から 1/360000、いや、1/14000 秒後だったか、まぁいい、私にとっては重要な精度だが、君たちにとっては、たぶん……使いどころのない話だ。
Time#strftime には 72 通りのフォーマット文字列があるから*1、何を選べばいいのか、たしか最近よく使うのは、%N。
そう、あいつは最初から言うことを聞かなかった。私の言う通りにしていればな。まぁ、いいやつだったよ。
def showtime(t = Time.now) t.strftime("%Y-%m-%d %H:%M:%S.%%3d") % (t.tv_usec / 1e3) end
「そんな実装で大丈夫か?」「大丈夫だ、問題ない。」
>> t = Time.local(2010, 12, 18) >> showtime(t + 14000 / 1e6) => "2010-12-18 00:00:00. 14"
「神は言っている、『ここでバグる運命ではない』と。」
「%N、そんな実装で大丈夫か?」「一番いいのを頼む。」
def showtime(t = Time.now) t.strftime("%F %T.%3N") end
>> showtime(t + 359999 / 1e6) => "2010-12-18 00:00:00.359" >> showtime(t + 360000 / 1e6) => "2010-12-18 00:00:00.359" >> showtime(t + 360001 / 1e6) => "2010-12-18 00:00:00.360"
「神は言っている、『すべてのケースを救え』と。」
「やぁ、Ruby の浮動小数サポートが心配なのか?」
「いいんじゃないかなぁ。」
「あいつもよくやってくれてるしね。」
「いや、クライアントの要求は断れないよ。」
「お客様は絶対だからね。」
「%N、Rational が持つ有理数絶対の力、それは自らの意志で、require "mathn" するか選択することだ。*2」
「Ruby は常に人にとって最良の未来を思い、自由に選択していけ。さぁ、行こう。」
「%N、私のかわいい小数たちが悲しみに泣いている。行きなさいあなたたち。」
「ダイニヒキスウデカタキヲトルノデス。」
>> showtime(Time.at(t, 360000)) => "2010-12-18 00:00:00.360"
(To Be Continued...)
「あぁ、やっぱり今回も短くまとめるのダメだったよ。」
「あいつは話を聞かないからなぁ。」
「そうだな、次はこれを見ているやつにもデバッグ付き合ってもらうよ。」
Time#strftime の %N と Time.at の第 2 引数について紹介しました。知っていればロジックを入れ込まなくてもデータ構造で正確に表現出来るようになるといういい例なのではないかと思います。詳しくは「るりま」で。
[参考文献]
I wish you Merry Christmas & Happy New Year!