【问题标题】:Why does Ruby's Time class allow invalid dates like February 30?为什么 Ruby 的 Time 类允许像 2 月 30 日这样的无效日期?
【发布时间】:2016-05-30 06:13:36
【问题描述】:

当你尝试时:

Time.new(2016, 2, 30)

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

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

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

这是一个错误吗?

【问题讨论】:

  • 2016 year has only 29 days in the February month. 这不是错误,而是功能。
  • 请检查您的日期,您已过 2016 年 2 月 30 日,这怎么可能?
  • 是的,我也想知道。我尝试在 irb 中,奇怪的事情发生了。它应该是失败的,但是..
  • 我更新了我的帖子:2016-2-30 不应该存在,但在 irb 中它将在下个月返回。
  • 存在但2016年没有。

标签: ruby date time


【解决方案1】:

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 ...>

【讨论】:

  • 目前我尝试制作 Time 类来覆盖 Time#initialize 函数,然后在初始化中使用 super。有可能吗?
  • 这可能是可能的,但你不应该修改 Ruby 的核心类。
  • 选择 Time.new 而不是 Date.new 意味着您在上午 12:00 获得时间。即使日期无效,您也会在与正确计算日期相对应的有效日期获得时间。 Date.new 抛出无效日期错误,因为兴趣是日期而不是时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2017-04-22
  • 2021-08-21
  • 2013-12-04
相关资源
最近更新 更多