【Ruby】文字列をDate(日付)に変換する時は桁数を意識しないと違う日付になる
文字列が意図しない日付になる?
売上などのデータでcsvファイルを連携して取り込むってのはよくある話だと思うのですが、単純に文字列結合して変換すると違った日付になったりエラーになったりするので気をつける必要がある。
> require 'date' => true >Date.parse("2017121") => #<Date: 2017-05-01 ((2457875j,0s,0n),+0s,2299161j)> # 期待するのは「2017/12/1」だけど7桁だと「2017/05/01」になる!!! > Date.parse("201711") ArgumentError: invalid date from (irb):25:in `parse' from (irb):25 from /home/bondgate/.rbenv/versions/2.3.3/bin/irb:11:in `<main>' # 6桁だとエラーになる > Date.parse("2017011") => #<Date: 2017-01-11 ((2457765j,0s,0n),+0s,2299161j)> # 後ろ2桁を見て判断してるっぽい > Date.parse("2017041") => #<Date: 2017-02-10 ((2457795j,0s,0n),+0s,2299161j)> # 41日と判断してっぽいので「2/10」になる。
文字列を正しい日付に変換する方法
きちんと8桁になるように、new
or 0埋めでparse
すること。
> Date.parse("20171201") => #<Date: 2017-12-01 ((2458089j,0s,0n),+0s,2299161j)> > year = "2017" > month = "12" > day = sprintf("%02d",1) => "01" > Date.parse(year + month + day) => #<Date: 2017-12-01 ((2458089j,0s,0n),+0s,2299161j)> > Date.new(2017, 1,1) => #<Date: 2017-01-01 ((2457755j,0s,0n),+0s,2299161j)>
まとめ
7桁の場合はエラーにならないので、知らぬ知らぬで間違った日付で更新するなんて全然ありえるから怖いね。 日付を扱う時は、しっかりとあらゆる想定をするのが大事そうだ!
そんな感じ。