Ruby 如何解决“DateTime.parse”上的崩溃问题;2月29日?

Ruby 如何解决“DateTime.parse”上的崩溃问题;2月29日?,ruby,datetime,Ruby,Datetime,我解析文本日期,并将返回一个DateTime,如下所示: DateTime.parse "Feb. 28" # => Sat, 28 Feb 2015 00:00:00 +0000 但是,解析“2月29日”会导致无效的日期崩溃。如何解决此崩溃以说明闰年日期?您可以使用以下方法确定年份是否为闰年: 因此,如果是闰年,您可以将年份与日期一起传递,即DateTime.parse“2016年2月29日”。这样,您的程序就不会崩溃 或者,您可以始终使用日期和年份来避免此类情况。i、 e.DateT

我解析文本日期,并将返回一个
DateTime
,如下所示:

DateTime.parse "Feb. 28"
# => Sat, 28 Feb 2015 00:00:00 +0000

但是,解析
“2月29日”
会导致无效的日期崩溃。如何解决此崩溃以说明闰年日期?

您可以使用以下方法确定年份是否为闰年:

因此,如果是闰年,您可以将年份与日期一起传递,即
DateTime.parse“2016年2月29日”
。这样,您的程序就不会崩溃

或者,您可以始终使用日期和年份来避免此类情况。i、 e.
DateTime.parse“2013年2月28日”
DateTime.parse“2016年2月29日”
等。如果您以这种格式传递日期,则不必明确检查闰年。

您可以捕获解析无效日期时引发的异常

begin
  d = DateTime.parse("Feb. 29")
rescue ArgumentError  
  d = "Invalid Date"
end

但这可能并不理想,真正取决于您对数据的处理方式,以及最佳的处理方式。如果你正在寻找一个完整的日期对象,最好是检查一个给定日期时间对象的闰年,然后从那里开始;它需要一年的时间。通过解析
“2月28日”
,您可能已经注意到,省略年份表示字符串将被解析为当前年份。字符串
“2月29日”
不是无条件拒绝的,但由于今年(2015年)不是闰年,因此
“2月29日”
无效

因此,解决方案是,无论何时解析要作为当前年份计算的字符串,它都能正常工作<代码>“2月29日”将被正确拒绝,如果当前年份不是闰年。否则,您需要提供一个明确的年份


K M Rakibul Islam的答案在正确的轨道上提到了应提供的明确年份,但该答案在何时这样做是错误的。

由于您没有通过一年,因此默认使用当前年份。因为2015年没有2月28日,所以这是一个无效日期。如果你通过一年
DateTime.parse(“2016年2月29日”)
return@trh有没有办法在ruby/rails中捕获异常?这是我见过的最有趣的错误。因此,它将工作一年,然后在接下来的3年中失败,然后再次工作一年?;)是的,这是一个滑稽的行为-我发布了一个救援答案-但它对大多数应用程序来说都很糟糕。你想如何处理这个异常?只需在第二天返回
nil
?您认为在您的用例中什么是合适的?您好,请您指出我的答案中哪一部分是错误的
,但该答案在何时这样做是错误的。
(不过我在您的答案之后编辑了我的答案)。但是,我不知道你指的是哪一部分。如果你能解释一下,我将不胜感激。谢谢。@KMRakibulIslam请不要在我的评论后编辑您的答案,因为这意味着您正在将我的答案复制到您的答案中。事实上,这就是我在回答中提到它的原因,而不是作为对你的评论。我不打算在你的答复中反映我的答复/评论。正如我所写的,如果省略的年份不是闰年,那么2月29日出现的错误是正确的行为。日期不能没有年份(隐式或显式),非闰年不存在2月29日。省略年份不应取决于当前年份是否为闰年。这是我的编辑修订:如果您认为有任何内容是从您的答案中复制的,请随意再次编辑。谢谢你。@CarySwoveland-的确如此,答案已经更新了。
begin
  d = DateTime.parse("Feb. 29")
rescue ArgumentError  
  d = "Invalid Date"
end