解析"某些日期" (在Ruby中)Time.strptime
和Date.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
不同行为的原因是什么?为什么时间"尝试调整"无效的日期?
答案 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点)