コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Time.newは31日が存在しない月に31日を指定しても、勝手に繰り上がる

親切だけど、知らないとビビる感じなのでメモ

環境

$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]

事象

TIme.newで Time.new(2018,6,31) などをしてもエラーにならず勝手に 2018/7/1 相当の情報が返却される

Time.new(2019,1,11)
# => 2019-01-11 00:00:00 +0900
Time.new(2019,6,31)
#=> 2019-07-01 00:00:00 +0900

2月の場合もよしなに判断してくれる

Time.new(2019,2,29)
#=> 2019-03-01 00:00:00 +0900
Time.new(2019,2,30)
#=> 2019-03-02 00:00:00 +0900
Time.new(2019,2,31)
#=> 2019-03-03 00:00:00 +0900

なおDateTimeの場合はエラーになる

DateTime.new(2019,6,31)
#ArgumentError: invalid date