[Ruby] Apacheログ 時刻形式をDateTimeへ変換する

Apacheのログに出力される時刻の形式は

[19/Jun/2013:13:52:02 +0900]

のようになっている。

ログファイル – Apache HTTP サーバ
ドキュメントによると次のような形式とのこと。

[day/month/year:hour:minute:second zone]
day = 2*digit
month = 3*letter
year = 4*digit
hour = 2*digit
minute = 2*digit
second = 2*digit
zone = (`+' | `-') 4*digit

さすがにDateTime.parseに突っ込んでもパースできず。

pry> DateTime.parse('[19/Jun/2013:13:52:02 +0900]')
ArgumentError: invalid date
from (pry):12:in `parse'

Rubyのドキュメント探したけど、ぱっと見てみた限りではこの形式をそのままパースしてくれそうなメソッドはなかった。(あったら教えて下さいませ。)

なので、ひとつひとつ確かめながらDateTime.strptimeでパースしてみると、次のフォーマットでパースできることがわかった。

[%d/%b/%Y:%H:%M:%S %z]
pry> DateTime.strptime('[19/Jun/2013:13:52:02 +0900]', '[%d/%b/%Y:%H:%M:%S %z]')
=> #<DateTime: 2013-06-19T13:52:02+09:00 ((2456463j,17522s,0n),+32400s,2299161j)>

+0900の部分をどう書くなかなか見つからなくて若干ハマった。
zoneだから%Zじゃない?いや%zかも。で、ビンゴ。

後から見つけたけど、DateTime.strptime, DateTime.strftimeに使用されるフォーマットについては下記のドキュメントが詳しい。

Class: DateTime (Ruby 2.0)

関連記事

    None Found

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です