素の 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 log
の Date:
のフォーマットは超マイナー
・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 log
の Date:
をRubyでParseするときは Time.parse
を使うのが良さそう.
---///