Rails agrega un método to_date
al String
. Su fuente es simple:
# File activesupport/lib/active_support/core_ext/string/conversions.rb, line 42
def to_date
return nil if self.blank?
::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday))
end
Date._parse
es nativa a Ruby (el mismo método es llamado por Date.parse
) y es where the real work is done.
Primero utiliza una expresión regular para eliminar símbolos extraños de la cadena, luego la pasa a otros métodos como _parse_eu
, _parse_iso
, _parse_dot
y así sucesivamente. Cada uno de estos usa sus propias expresiones regulares y otros métodos para ver si se trata de una fecha que comprende y extraer la información significativa de la misma. Una vez que uno de ellos "funciona" (es decir, devuelve verdadero), el resto se omite. Finalmente, de vuelta en _parse
, la información extraída se usa para construir una fecha y hora, haciendo un poco más de trabajo para averiguar cosas como verificar el día de la semana y si un valor de año de "12" debe significar 1912 o 2012.
Los documentos llaman a esto un método heurístico, lo que podría interpretarse como que arroja un montón de posibilidades en la pared para ver qué se adhiere. Está bastante mal documentado pero funciona notablemente bien.
'strptime' tiene que conocer el formato de fecha de otro modo sería utilizar su formato predeterminado. Pero AR puede analizar mágicamente fechas en varios formatos. –
Asegúrese de estar probando todos los formatos de fecha que un usuario podría presentar. No son siempre deterministas. – aceofspades