无效的日期ArgumentError和有效日期的错误解析?

时间:2014-05-13 13:00:55

标签: ruby date

dates = ["11/12/08 10:47", "11/12/08 13:23", "11/12/08 13:30", 
         "11/25/08 19:21", "2/2/09 11:29", "11/12/08 15:00"] 

这会抛出一个无效的参数错误:

dates.each do |date|
  d = Date.parse(date)
  d.mon
end
 #=> ArgumentError: invalid date

但请在dates中取第一个日期,这是输出:

d = Date.parse('11/12/08 10:47')
puts d.mon
 #=> #<Date: 2011-12-08 ((2455904j,0s,0n),+0s,2299161j)> 
 #=> 12 but this should be 11
  1. 在第一个例子中,我为什么会收到无效的ArgumentError?
  2. 在示例2中,为什么在Datemon交换时创建的day对象?

2 个答案:

答案 0 :(得分:12)

根据您的输入,Date.parse正在解析您的日期,假设它们采用YY/MM/DD格式,因此当它尝试解析11/25/08时,它会失败,因为25不是有效月份:

d = Date.parse('11/12/08 10:47')
d.year
# => 2011
d.month
# => 12
d.day
# => 8

Date.parse('11/25/08 19:21')
# ArgumentError: invalid date

鉴于您的日期格式相同,您应该使用Date.strptime方法:

d = Date.strptime('11/12/08 10:47', '%m/%d/%y')
d.year    
# => 2008
d.month
# => 11
d.day
# => 12

Date.strptime('11/25/08 19:21', '%m/%d/%y')
# => #<Date: 2008-11-25 ((2454796j,0s,0n),+0s,2299161j)>

修改而不是格式字符串%m/%d/%y,可以使用快捷方式%D

Date.strptime('11/25/08 19:21', '%D')
# => #<Date: 2008-11-25 ((2454796j,0s,0n),+0s,2299161j)>

答案 1 :(得分:1)

Ruby的Date.parse期待YYYY-MM-DD(更多信息请参见ISO8601)或DD-MM-YYYY但不是DD-MM-YY (即仅2年的2位数)。最后一个被视为YY-MM-DD。