2009-04-28 18 views
18

Sto utilizzando Time.parse per creare un oggetto Time da una stringa.Ruby Time.parse mi dà un errore fuori intervallo

Per qualche ragione

Time.parse("05-14-2009 19:00") 

provoca un argomento nostra gamma di errore, mentre

Time.parse("05-07-2009 19:00") 

non

Tutte le idee?

risposta

0

è probabilmente aspettano giorno-mese-anno formato, in modo che il primo valore sta cercando di specificare il 5 ° giorno del mese 14 °.

26

Se si conosce il formato dell'uso stringa:

Time.strptime(date, format, now=self.now) {|year| ...} 

http://www.ruby-doc.org/core-1.9/classes/Time.html#M000266

che possa risolvere il problema e sarà probabilmente più veloce di Time.parse.

EDIT:

Sembra che hanno preso strptime dalla classe Tempo, ma è chiamato Date.strptime comunque. Se siete su Rails si può fare:

Date.strptime("05-14-2009 19:00","%m-%d-%Y %H:%M").to_time 

se si utilizza rubino puro, allora avete bisogno:

require 'date' 
d=Date._strptime("05-14-2009 19:00","%m-%d-%Y %H:%M") 

Time.utc(d[:year], d[:mon], d[:mday], d[:hour], d[:min], 
     d[:sec], d[:sec_fraction], d[:zone]) 

Vedi anche: Date and Time formating issues in Ruby on Rails.

+0

strptime sembra interessante ma ottengo un metodo non definito per Time.strptime e ho bisogno di un oggetto orario – Tony

+1

... ecco l'ora di utilizzo.strptime (data_time ['valore'], "% m-% d-% Y % H:% M ") – Tony

+0

Sembra che la durata minima non esista più nel tempo, vedi modifica per l'alternativa – Miquel

13

E 'a causa delle euristiche di Time#parse.

Ed è dovuto ai formati anglo-americani.

Con trattini '-' si aspetta mm-gg-aaaa, con barre '/' si aspetta gg/mm/aaaa.

Questo comportamento modifica intenzionalmente in 1.9. per raggiungere gli standard di data eur, iso e jp.

+0

Penso che i formati siano confusi qui. Con trattini '-' si aspetta' gg-mm-aaaa' o 'aaaa-mm-gg' (in quest'ultimo caso, i primi due 'y' sono facoltativi), con barre'/'si aspetta' mm/gg/aaaa' (anche qui i primi due 'y' sono facoltativi). –

+2

So che questa è una vecchia risposta, ma non vedo il comportamento descritto. Sto usando 1.9.2p136. Time # parse interpreta l'input come gg/mm/aaaa se uso '-' o '/'. –

+0

Il mio commento sopra non è corretto. Per Ruby 1.8.6 e 1.8.7 sembra 'mm/gg/aaaa' e per 1.9.2 è' gg/mm/aaaa'. Entrambi i Rubys analizzano il formato del trattino come 'gg-mm-aaaa'. Ma non sono sicuro al 100% se è solo a causa della versione di Ruby, o se anche altri fattori influenzano l'analisi; come le impostazioni di data, ora, regione e fuso orario del computer. –

4

Probabilmente non ne hai bisogno per risolvere questo problema, ma consiglio comunque di controllare il parser data/ora in lingua naturale Chronic, mi ha risparmiato un sacco di lavoro un paio di volte.

Problemi correlati