Rails aggiunge un metodo to_date
a String
. La sua fonte è semplice:
# 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
è nativo a Ruby (lo stesso metodo viene chiamato da Date.parse
) ed è where the real work is done.
Prima utilizza un'espressione regolare per rimuovere simboli estranei dalla stringa, quindi passa ad altri metodi come _parse_eu
, _parse_iso
, _parse_dot
e così via. Ognuno di questi utilizza le proprie espressioni regolari e altri metodi per vedere se è una data che capisce ed estrarre le informazioni significative da esso. Una volta che uno di essi "funziona" (cioè restituisce true), il resto viene saltato. Infine, tornando in _parse
, le informazioni estratte vengono utilizzate per creare una data e un'ora, facendo un po 'più di lavoro per capire cose come controllare il giorno della settimana e se un valore di anno "12" dovrebbe significare 1912 o 2012.
I documenti lo chiamano un metodo euristico, che potrebbe essere interpretato come un modo per gettare un sacco di possibilità sul muro per vedere cosa si attacca. È piuttosto mal documentato, ma funziona molto bene.
fonte
2012-03-15 17:54:10
'strptime' deve conoscere il formato della data, altrimenti avrebbe usato il suo formato di default. Ma AR può analizzare magicamente le date in diversi formati. –
Assicurati di testare tutti i formati di data che un utente potrebbe presentare. Non sono sempre deterministici. – aceofspades