2014-11-22 15 views
5

Ich habe Datum als Zeichenfolge in einem solchen Format: 23 Nov. 2014. Sicher, es ist leicht, diese Zeichenfolge in Datum zu konvertieren mit einem solchen Ausdruck:Konvertieren Zeichenfolge in Datum mit Ruby

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

Aber es gibt ein Problem, wenn Monat Mai ist - es gibt keinen Punkt, wie 23 May 2014. Und mein Ausdruck bricht.

Könnte jemand mit diesem Problem helfen? Wie kann ich universellen Ausdruck für meine Fälle machen?

Antwort

3

Entfernen Sie den Zeitraum von my_string und vom Datumsmuster.

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

das bei Ihnen unter der Annahme hat höchstens einen Punkt in my_string. Wenn es mehrere gibt, verwenden Sie gsub.

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

Anstelle von 'sub' oder' gsub' verwenden Sie 'tr ('.', '')'. Es ist schneller und wird dasselbe erreichen. –

+0

... oder 'my_string.delete ('.')'. –

2

Ich denke, Sie verwenden die falsche Methode. Date#parse sollte mit fast „alles“ (siehe TinMan Antwort und Kommentar zur Klärung, wenn sie nicht Parse verwenden) arbeiten und bieten das gleiche Objekt:

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

Datum Parse funktioniert nicht mit irgendetwas, es ist eigentlich ziemlich begrenzt, und langsamer, und anfällig für Fehler aufgrund von Unterschieden in gängigen Datumsformaten zwischen den USA und dem Rest der Welt. Verwenden Sie stattdessen 'strptime' für Datumsformate, die Sie erkennen, und vielleicht als Alternative zu' parse'. Am besten ist es, die LOCALE-Einstellung des Benutzers zu kennen oder sie einfach aus einer Auswahl von Alternativen anzugeben und diese zu verwenden. –

+0

USA gegen den Rest der Welt? Das finde ich eher elitär. Wir sprechen hier über ein INTERNATIONALES Datumsformat, wenn ein bestimmtes Land (wie die USA oder irgendein anderes) ihre spezifische Art hat, Daten zu repräsentieren, dann kann man nicht sagen, dass die Analyse-Methode "nicht funktioniert", nur weil es unterstützt einige X Länderimplementierung nicht. – daremkd

+1

Es gibt nichts, was "elitär" erwähnt oder impliziert wird. Das gebräuchlichste US-Datumsformat ist anders und zu viele Leute wissen das nicht. Ruby, eine international orientierte Sprache, macht es richtig. Ich denke, deine Politik färbt, wie du den Kommentar liest. –

0

Die parse Methode versucht, passende Datum oder Zeitformate zu finden, Analysieren Sie dann die Zeichenfolge, um die Werte zurückzugeben, die zum Erstellen eines neuen Datums oder DateTime verwendet wurden. Es gibt viele verschiedene Formate, die unterstützt werden, was praktisch ist, aber der Vorgang des Scannens, um eine Übereinstimmung zu finden, verlangsamt die Analysezeit.

Auch einige gängige Formate sind nicht notwendig "passen". Überlegen Sie, was passiert hier:

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

Das Datum Zeichenfolge in '%d/%m/%Y' (Tag, Monat, Jahr) Format analysiert wird, obwohl es in den USA nicht üblich ist, weil Rubin kein US-centric Sprache. Die Umkehr der ersten beiden Felder ergibt:

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

Ja, ich sehe, danke! Und ich schätze, Sie empfehlen mir auch, die Periode aus der Saite zu entfernen und 'strptime' zu ​​verwenden? – ktaras

+1

Sie sollten die Zeichenfolge wahrscheinlich normalisieren, indem Sie den Zeitraum entfernen. Es gibt Möglichkeiten, das zu umgehen, aber der Zeitraum ist kein normaler Teil eines dreistelligen Monatsnamens. –

Verwandte Themen