LoginSignup
0

More than 5 years have passed since last update.

git logのDateをrubyでparseする

Last updated at Posted at 2018-04-19

素の 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 を使うのが良さそう.

---///

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0