2014-05-13 11 views
6
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"] 

Questo genera un errore argomento non valido:Data non valida ArgumentError e parse non corretto di una data valida?

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

Ma prendere la prima data in dates e questo è l'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. Nel primo esempio perché sto ottenendo un ArgumentError non valida?
  2. Nell'esempio 2, perché è l'oggetto Date creato con l'mon e day scambiato?
+0

Probabilmente sta prendendo come 'formato AAAA-MM-dd' e cercando la stessa. – Pavan

+2

Quindi credo che '11/25/08' ti ha dato l'error.Because non c'è mese 25 – Pavan

risposta

10

Dato il vostro ingresso, Date.parse è l'analisi le date ammesso che sono nel formato YY/MM/DD, in modo che quando si tenta di analizzare 11/25/08 non riesce perché 25 non è un mese valida:

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 

Dato che sono le date tutto nello stesso formato, è necessario utilizzare il metodo Date.strptime invece:

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

Modifica invece del formato st anello %m/%d/%y la scorciatoia %D può essere utilizzato:

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

Ruby Date.parse si aspetta sia un'AAAA-MM-DD (vedi anche ISO8601 per maggiori informazioni) oppure un GG-MM-AAAA pure ma non DD-MM-AA (ovvero 2 cifre solo per l'anno). L'ultima è trattato invece come YY-MM-DD.

Problemi correlati