質問

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"] 

This throws an invalid argument error:

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

But take the first date in dates and this is the output:

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. In the first example why am I getting an invalid ArgumentError?
  2. In example 2, why is the Date object created with the mon and day swapped?
役に立ちましたか?

解決

Given your input, Date.parse is parsing your dates assuming they are in the format YY/MM/DD, so when it try to parse 11/25/08 it fails because 25 is not a valid month:

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

Given that your dates are all in the same format, you should use the Date.strptime method instead:

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

Edit Instead of the format string %m/%d/%y the shortcut %D can be used:

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

他のヒント

Ruby's Date.parse is expecting either a YYYY-MM-DD (see also ISO8601 for more information) or a DD-MM-YYYY as well but not DD-MM-YY (i.e. 2 digits only for year). The last is treated instead as YY-MM-DD.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top