かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Ruby 日付が存在するか知りたい

require "date"
p Date.new(2015, 2, 29) #=>  `new': invalid date (ArgumentError)

存在しない日付でDateオブジェクトを作ろうとするとArgumentErrorで死んでしまうので、Dateオブジェクトを作る前に日付が存在するか知りたい。

Date.valid_date?を使う

Date.valid_date?(year, mon, mday, start = Date::GREGORIAN) -> bool

p Date.valid_date?(2015, 2, 29) #=> false
p Date.valid_date?(2016, 2, 29) #=> true

require "date"

def putDate(y, m , d)
  p Date.new(y, m, d).to_s if Date.valid_date?(y, m, d)
end

putDate(2015, 2, 29) # 何も出力されない
putDate(2016, 2, 29) #=> "2016-02-29"

おまけ

p Time.new(2016, 2, 29).to_s #=> "2016-02-29 00:00:00 +0900"
p Date.new(2016, 2, 29).to_s #=> "2016-02-29"

p Time.new(2015, 2, 29).to_s #=> "2015-03-01 00:00:00 +0900"
p Date.new(2015, 2, 29).to_s #=> `new': invalid date (ArgumentError)

Timeだと次の日になるのにむしろ驚いたw

p Time.new(2015, 2, 31).to_s #=> "2015-03-03 00:00:00 +0900"
p Time.new(2015, 2, 32).to_s #=> initialize': argument out of range (ArgumentError)

ただ、31日より大きい日を与えるとエラーになるっぽい


[参考]

RWBY Volume1 Original Soundtrack VOCAL ALBUM

RWBY Volume1 Original Soundtrack VOCAL ALBUM