2014-11-22 14 views
5

Ho una data come stringa in tale formato: 23 Nov. 2014. Certo, è facile convertire questa stringa in data con tale espressione:Conversione di stringhe con Ruby

Date.strptime(my_string, '%d %b. %Y') 

Ma c'è un problema quando il mese è maggio - non v'è alcun punto, come 23 May 2014. E la mia espressione si spezza.

Qualcuno potrebbe aiutare con questo problema? Come posso rendere un'espressione universale per i miei casi?

risposta

3

Rimuovere il periodo da my_string e dal modello di data.

Date.strptime(my_string.sub('.', ''), '%d %b %Y') 

Che si sta assumendo avere al massimo un punto in my_string. Se possono essere diversi, utilizzare gsub.

Date.strptime(my_string.gsub('.', ''), '%d %b %Y') 
+1

Invece di 'sub' o' gsub', utilizzare 'tr ('.', '')'. È più veloce e realizzerà la stessa cosa. –

+0

... o 'my_string.delete ('.')'. –

2

Penso che stai usando il metodo sbagliato. Date#parse dovrebbe funzionare con quasi "nulla" (vedi risposta Tinman e commento di chiarimenti di quando non utilizzare parse) e fornire lo stesso oggetto:

p Date.parse('23 Nov 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> 
p Date.parse('23 Nov. 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> same object as with the previous line 
+2

L'analisi della data non "funziona con nulla", in realtà è piuttosto limitata, più lenta e soggetta a errori a causa delle differenze nei formati di data comuni tra gli Stati Uniti e il resto del mondo. Invece, usa 'strptime' per i formati di data che riconosci e forse fallback a' parse'. La cosa migliore è conoscere l'impostazione LOCALE dell'utente, o semplicemente lasciarli specificare da una selezione di alternative e usarlo. –

+0

Stati Uniti contro il "resto" del mondo? Trovo che una visione piuttosto elitaria. Stiamo parlando di un formato di data INTERNAZIONALE qui, se un paese specifico (come gli Stati Uniti o qualsiasi altro) ha il proprio modo specifico di rappresentare le date, allora non si può dire che il metodo di analisi "non funzioni" solo perché non supporta l'implementazione di alcuni paesi X. – daremkd

+1

Non c'è niente di "elitista" menzionato o implicito. Il formato di data degli Stati Uniti più comune è diverso e troppe persone non lo sanno. Ruby, essendo un linguaggio orientato a livello internazionale, sta facendo bene. Penso che la tua politica stia colorando il modo in cui leggi il commento. –

0

Il metodo parse tenta di trovare la data di corrispondenza o di formati di data-ora, quindi analizzare la stringa per restituire i valori utilizzati per creare una nuova data o data. Esistono molti formati diversi, il che è comodo, tuttavia il processo di scansione per trovare una corrispondenza rallenta il tempo di analisi.

Inoltre, alcuni formati di uso comune non "adattano" necessario. Considerate quello che sta succedendo qui:

Date.parse '31/01/2001' 
=> #<Date: 2001-01-31 ((2451941j,0s,0n),+0s,2299161j)> 

La stringa data '%d/%m/%Y' (giorno, mese, anno) formato viene analizzato, anche se non è comune negli Stati Uniti, a causa di Ruby non è un linguaggio USA-centrica. L'inversione dei primi due campi ha come risultato:

Date.parse '01/31/2001' 
ArgumentError: invalid date 
    from (irb):4:in `parse' 
    from (irb):4 
    from /Users/greg/.rbenv/versions/2.1.5/bin/irb:11:in `<main>' 
irb(main):005:0> Date.parse '31/01/2001' 
+0

Sì, capisco, grazie! E immagino che mi raccomandi anche di rimuovere il periodo dalla stringa e usare 'strptime'? – ktaras

+1

Probabilmente dovresti normalizzare la stringa rimuovendo il punto. Ci sono modi per ovviare a questo, ma il periodo non è una parte normale del nome di un mese di tre lettere. –

Problemi correlati