Ruby Time.strptime与Date.strptime

时间:2015-07-09 12:09:08

标签: ruby

解析"某些日期" (在Ruby中)Time.strptimeDate.strptime具有不同的行为。

例如,如果我们尝试转换" 2月30日" (一个不存在的日期),我们有:

Time.strptime('30 Feb 2015', '%d %b %Y') # will result in this date: 2015-03-02
Date.strptime('30 Feb 2015', '%d %b %Y') # ArgumentError: invalid date

同时试图解析" 2月32日"导致两个类都出错。

Time.strptime('32 Feb 2015', '%d %b %Y') # ArgumentError: invalid strptime format - `%d %b %Y'
Date.strptime('32 Feb 2015', '%d %b %Y') # ArgumentError: invalid date

不同行为的原因是什么?为什么时间"尝试调整"无效的日期?

1 个答案:

答案 0 :(得分:0)

好的,我做了一些挖掘,发现了一些关于这个主题的“问题”:https://bugs.ruby-lang.org/issues/9549和主要问题:https://bugs.ruby-lang.org/issues/10588

由于某种原因,Time以这种方式表现的接缝。正如田中彰一说:

  

无效的日期/时间很难确定。   应用程序几乎不可能,因为它取决于各种因素:   月,闰年,夏令时,闰秒,时区定义变化。

     

有时应用程序需要一个接近年/月/日/小时/分钟/秒的Time对象。

所以Time试图弥补可能的“几乎正确”时间。这就是它成功解析这个问题的原因: Time.strptime('29 Mar 2015 3:30:00 +02000', '%d %b %Y %T %z')来 2015-03-29 04:30:00 +0300(3:30是2015年3月29日的无效时间,因为夏令时,从3点钟移动到4点)