为什么Ruby的Time类允许2月30日之前的无效日期?

时间:2016-05-30 06:13:37

标签: ruby date time

当你尝试:

Time.new(2016, 2, 30)

它将返回下一个有效日期:

2016-03-01 00:00:00 +0900

我预计会出现错误,因为2016-02-30不是有效日期。

这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

Time.new似乎只检查日期值是否在1到31之间。我不确定这是否是错误或功能。至少它是不一致的。

您可以使用Date.valid_date?来验证日期:

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

同样,如果日期无效,Date.new会引发ArgumentError

Date.new(2016, 2, 30) #=> ArgumentError: invalid date
Date.new(2016, 2, 29) #=> #<Date: 2016-02-29 ...>