2011-03-20 12 views
47

En Rubí 1,87 lo que podía hacer:Rubí 1,87 vs 1,92 Date.parse

Date.parse ("3/21/2011") 

Ahora en 1.9.2 me sale:

ArgumentError: invalid date

¿Alguna idea?

+4

@bensiu, los documentos [] (http://rubydoc.info/stdlib/date/1.9.2/Date#parse-class_method) no ayudan a explicar el problema o proporcionan una forma de manejarlo. –

Respuesta

60

Usa strptime y dale un formato de hora específico.

ruby-1.9.2-p136 :022 > Date.strptime '03/21/2011', '%m/%d/%Y' 
=> #<Date: 2011-03-21 (4911283/2,0,2299161)> 

Ver michaelmichael's response por la razón de esta diferencia entre las versiones de Ruby.

+0

Simplemente curioso, pero ¿cómo definirías la configuración regional para el rubí? – mgm8870

+0

Parece que puede usar las extensiones de fecha de ActiveSupport: http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html –

+1

A partir de la fecha/formato.rb de fecha/_parse' método, no veo nada buscando información locale. El código asume un formato no estadounidense y lo busca primero, seguido por Estados Unidos. Un valor de mes fuera de rango (13-31) desencadena el problema. La mejor solución es saber de qué región viene la fecha y luego decidir mediante programación si usar el formato '% m /% d /% y' o'% d /% m /% y' en 'Date # strptime'. –

2

Siempre he tenido dificultades para analizar las fechas con Date.parse. Mi solución es agradecida con el chronic gem. También me gusta la función strptime que se encuentra en otra respuesta.

25

Por this bug report, la capacidad de analizar mm/dd/yy fechas se eliminó intencionalmente en 1.9. creador de Ruby, Yukihiro Matsumoto dice:

"dd/dd/dd" format itself is very culture dependent and ambiguous. It is yy/mm/dd in Japan (and other countries), mm/dd/yy in USA, dd/mm/yy in European countries, right? In some cases, you can tell them by accident, but we should not rely on luck in general cases. I believe that is the reason parsing this format is disabled in 1.9.

Como hansengel sugiere, se puede utilizar en lugar Date.strptime.

+0

Interesante. Entonces, ¿por qué 'Date.parse ('1/1/2001')' funciona en Ruby 1.9.2-p180, y aparece en el código fuente de date.rb? 'Date.parse ('1/1/2001') # => # ', 'RUBY_VERSION # =>" 1.9.2 "' [' Date.parse'] (http://rubydoc.info/stdlib/date/1.9.2/Date#parse-class_method) –

+0

@ Tin Man, que está analizando el primer 1 como el día y el segundo 1 como el mes (formato dd/mm/aa). No se puede decir porque son el mismo número;) –

+0

@michaelmichael, gracias por encontrar la verdadera razón para esto. Actualicé mi respuesta para hacer referencia a la tuya, para que la respuesta aceptada tenga todo correcto. –

1
class << self 
    def parse_with_us_format(date, *args) 
     if date =~ %r{^\d+/\d+/(\d+)$} 
     Date.strptime date, "%m/%d/#{$1.length == 4 || args.first == false ? '%Y' : '%y'}" 
     else 
     parse_without_us_format(date, *args) 
     end 
    end 
    alias_method_chain :parse, :us_format 
    end 
2

me gusta la gema american_date para lograr esto ...

+0

¿Por qué esta solución se siente tan sucia? Intenté modificar mi código para usar Time.strptime (...), pero encontré un problema en cascada con JQuery datepicker y los formatos de base de datos PostgreSQL. Horas desperdiciadas Pero la gema funciona perfectamente ... solo se siente hackosa y sucia ... ¡esperando que este problema surja nuevamente en el futuro! – vanboom

+0

@vanboom Sí, es un poco raro, pero el autor de esa gema es * la * autoridad en las fechas de Ruby, por lo que es obviamente necesario si escribió una gema. – Dex