渡されてきた変数dateを確実に日付として扱いたい場合、少なくとも2つの方法がありますよね。
- Date.parse(date)
- date.to_date
どちらを使うべきか、迷ったことはありませんか?私の中で結論が出たので、解説します。
Date.parse()と.to_dateで挙動が異なるケース比較
通常時(’2023/3/29’)は同じ挙動です。
> date = '2023/3/29'
=> "2023/3/29"
> Date.parse(date)
=> Wed, 29 Mar 2023
> date.to_date
=> Wed, 29 Mar 2023
しかし、以下のケースは挙動が異なりました。
1.空文字(”)
Date.parseはエラーが返ってきますが、to_dateはnilを返してくれます。
> date = ''
=> ""
> Date.parse(date)
Date::Error: invalid date
from (pry):5:in `parse'
> date.to_date
=> nil
2.NULL(nil)
さすがにどちらもエラーが返ってきます。
> date = nil
=> nil
> Date.parse(date)
TypeError: no implicit conversion of nil into String
from (pry):6:in `parse'
> date.to_date
NoMethodError: undefined method `to_date' for nil:NilClass
date.to_date
^^^^^^^^
Did you mean? to_d
from (pry):7:in `<main>'
ただ、to_dateは&でnil回避ができますね。
> date&.to_date
=> nil
3.date型(Wed, 29 Mar 2023)
Date.parseはエラーが返ってきますが、to_dateはそのまま返してくれます。
> date = Date.parse('2023/3/29')
=> Wed, 29 Mar 2023
> Date.parse(date)
TypeError: no implicit conversion of Date into String
from (pry):3:in `parse'
> date.to_date
=> Wed, 29 Mar 2023
4.西暦下二桁のみ( ’23/3/29’)
こちらは、Date.parseは正常に返ってきますが、to_dateは弥生時代になってしまいます。
> date = '23/3/29'
=> "23/3/29"
> d = Date.parse(date)
=> Wed, 29 Mar 2023
> date.to_date
=> Mon, 29 Mar 0023
結論:エラーをできるだけ回避したいならdate&.to_dateが便利
ただし「空でない文字列」であることが保証されている場合は、西暦下二桁のみにも対応可能してくれるDate.parseの方が良いですね。「空でない文字列」以外が来た時にあえてエラーを出したい場合もDate.parseの方が良いかも。
そう考えると、タイトルと真逆ですが、理想は「空でない文字列であることを保証した上でDate.parse」かもしれませんね。
追記
こんな方法もあるようです。
> Date.strptime('2023/3/29', '%Y/%m/%d') => Wed, 29 Mar 2023
参考:https://song-of-life.hatenablog.com/entry/2018/12/05/131231
はるすと
最後まで読んでくださってありがとうございました!
コメント