Edited at

git logのDateをrubyでparseする

More than 1 year has passed since last update.

素の git log の出力をRubyでParseするときに,Date: をParseするのにどのClassを使うか?で結果が変わってくることがあったので,忘備録かねてメモ.


追記 : 2018/06/26

環境のTimeZoneとParseする文字列のTimeZoneが一致していない場合,Time.parseも正しくなくなる.

irb> date = "Sun Apr 1 06:00:00 2018 +0800"

irb> Time.parse(date)
=> 2018-04-01 06:00:00 +0900

TimeZone情報は環境のTimeZoneで上書きされる模様.

irb> date = "Sun Apr 1 06:00:00 2018 +0800"

irb> Time.strptime(date, "%a %b %d %H:%M:%S %Y %z")
=> 2018-04-01 06:00:00 +0800

のように,文字列Formatの指定をしてstrptimeでParseさせるようにすればTimeZone情報も正しくParseできる.

// 追記ここまで


TL;DR

・素の git logDate: のフォーマットは超マイナー

Time, Date, DateTime, TimeWithZone,の結果は一致しない

・なんも考えずに Time.parse 使えばOKぽいぽい.

Time.parseも環境と文字列のTimeZoneが一致していないときは使えない

Time.strptimeで文字列Formatを指定してParseさせると期待どおりに動く.


git log の Date:

素の git log は ↓ のようなフォーマットで日付時刻情報を文字列化,表示する.

Date:   Thu Apr 19 16:55:45 2018 +0900

これを,Rubyの日付時刻系 4 ClassそれぞれでParseしてみます.


対象文字列

ぱっと見のわかりやすさと,UTC vs. JST で日付境界をまたぐように,

gitdate = "Sun Apr 1 06:00:00 2018 +0900"

をParseします.

ちなみに環境のTimeZoneはJSTです.

irb> Time.now.zone

=> "JST"


Time

irb> Time.parse(gitdate)

=> 2018-04-01 06:00:00 +0900

正しそう.

日本時間午前6時.

// 追記ここから

正しくない.

正しくなるのは環境のTimeZoneと文字列のTimeZoneが一致しているときのみ.

// 追記ここまで


Date

irb> Date.parse(gitdate)

=> Sun, 01 Apr 2018

正しそう.

UTC時刻での日付は2018/03/31になるはずなので,TimeZoneが反映されたLocal Timeの日付になっていそう.

ただ,情報の欠落が起こるのでDateを使うことはないかな.


DateTime

irb> DateTime.parse(gitdate)

=> Sun, 01 Apr 2018 06:00:00 +0000

正しくない.

UTC時間で 06:00 になっているので,JSTでは 15:00 になってしまう.

DateTime.parse+0900 の表現を無視るっぽい.


DateWithZone

irb> Time.zone.parse(gitdate)

=> Sun, 01 Apr 2018 06:00:00 UTC +00:00

正しくない.

DateTimeと同じでTimeZone情報がParseできてない.


まとめ

素の git logDate: をRubyでParseするときは Time.parse を使うのが良さそう.

---///