2009-04-28 8 views
18

Estoy usando Time.parse para crear un objeto Time a partir de una cadena.Ruby Time.parse me da error fuera de rango

Por alguna razón

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

provoca una discusión de nuestro error en la distancia, mientras que

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

no

¿Alguna idea?

Respuesta

0

Es probablemente esperando formato día-mes-año, por lo que su primer valor está tratando de especificar el quinto día del mes 14a.

26

Si conoce el formato de la cadena de uso:

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

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

Se va a resolver su problema y es probable que haya más rápido que Time.parse.

EDIT:

Parece que tomaron strptime de la clase de tiempo, pero de todos modos llamados Date.strptime. Si usted está en los carriles que puede hacer:

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

si utiliza rubí puro, entonces necesita:

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

Ver también: Date and Time formating issues in Ruby on Rails.

+0

strptime parece genial pero obtengo un método indefinido para Time.strptime y necesito un objeto de tiempo – Tony

+1

... aquí está el uso Time.strptime (date_time ['value'], "% m-% d-% Y % H:% M ") – Tony

+0

Parece que strptime ya no existe en Time, ver edit para la alternativa – Miquel

13

Es debido a la heurística de Time#parse.

Y es debido a los formatos anglo-americanos.

Con guiones '-' se espera mm-dd-aaaa, con barras inclinadas '/' espera dd/mm/aaaa.

Este comportamiento cambia intencionalmente en 1.9. para cumplir con los estándares de fecha de eur, iso y jp.

+0

Creo que los formatos están mezclados aquí. Con guiones '-' espera' dd-mm-aaaa' o 'aaaa-mm-dd' (en este último caso, los primeros dos' y' s son opcionales), con barras inclinadas '/' espera 'mm/dd/yyyy' (aquí los primeros dos 'y's también son opcionales). –

+2

Sé que esta es una respuesta anterior, pero no veo el comportamiento descrito. Estoy usando 1.9.2p136. Time # parse interpreta la entrada como dd/mm/aaa si utilizo '-' o '/'. –

+0

Mi comentario anterior no es correcto. Para Ruby 1.8.6 y 1.8.7 parece ser 'mm/dd/aaaa' y para 1.9.2 es' dd/mm/aaaa'. Ambos Rubys analizan el formato del tablero como 'dd-mm-aaaa'. Pero no estoy 100% seguro de que eso sea solo por la versión de Ruby, o si otros factores también afectan el análisis sintáctico; como la configuración de fecha, hora, región y/o zona horaria de la computadora. –

4

Probablemente no lo necesite para resolver este problema, pero aún así recomiendo consultar el analizador de fecha/hora en lenguaje natural Chronic, me ha ahorrado mucho trabajo un par de veces.

Cuestiones relacionadas