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?
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?
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.
Simplemente curioso, pero ¿cómo definirías la configuración regional para el rubí? – mgm8870
Parece que puede usar las extensiones de fecha de ActiveSupport: http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html –
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'. –
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.
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
.
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') # => #
@ 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;) –
@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. –
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
me gusta la gema american_date para lograr esto ...
¿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
@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
@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. –