TAI64N形式の文字列をTimeに変換する関数
ログを抽出する際にtai64nlocalするのを忘れたため、rubyで解析する羽目に。ということで、いろいろ手抜きしつつTAI64N形式の文字列をTimeに変換する関数を書きました。
- 「@40000000」ではじまる文字列のみ解析可能。(つまり1970-1-1以前の日時は解析できません)。
- 普通に解析すると「tai64nlocal」の解析結果となぜか10秒ずれる。
- 調査する時間がないので、とりあえず10秒引いて辻褄を合わせると言う体たらく。
- kunishi's blog - external TAI64N形式のデコードでもやはり10秒ずれるらしい。
# 1970-1-1以降のtai64n形式の日時をtimeに変換する。 def tai_to_time( tai ) raise "illegal format" unless tai =~ /\@40000000([\da-f]{8})([\da-f]{8})/ return Time.at($1.hex-10, $2.hex/1000.0) end # 呼び出し例 time = tai_to_time("@4000000037c219bf2ef02e94") puts time.strftime("%Y-%m-%d %X.") + time.usec.to_s
実行結果です。
1999-08-24 13:04:05.787492
「tai64nlocal」で解析した結果とだいたいあってますかね。
$ echo "@4000000037c219bf2ef02e94" | tai64nlocal 1999-08-24 13:04:05.787492500