おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

【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桁の場合はエラーにならないので、知らぬ知らぬで間違った日付で更新するなんて全然ありえるから怖いね。 日付を扱う時は、しっかりとあらゆる想定をするのが大事そうだ!

そんな感じ。