String in DateTime konvertieren

97

Ich muss den folgenden String in ein DateTime-Objekt analysieren:
30/Nov/2009:16:29:30 +0100

Gibt es eine einfache Möglichkeit, dies zu tun?

PS: Ich möchte den obigen String so wie er ist konvertieren. Der Doppelpunkt nach dem Jahr ist kein Tippfehler. Ich möchte das Problem auch mit Ruby und nicht mit RoR lösen.

SkaveRat
quelle

Antworten:

99

Mit DateTime.strptime können Sie das Format angeben und einen String in einen DateTime konvertieren.

Kaleb Brasee
quelle
1
Vielen Dank. Vermisst, dass ich ihm mein eigenes Format geben könnte. Hier ist die Arbeit: '% d /% b /% Y:% H:% M:% S'
SkaveRat
1
@SkaveRat Respektiert Ihre Zeichenfolge die Zeitzone? Ich benutze%d/%b/%Y:%H:%M:%S %Z
Knut
4
Für eine Liste der verfügbaren Formatabkürzungen gist.github.com/halloffame/5350249
Ryan
7
Es wäre höflich, ein Beispiel für die Konvertierung eines Strings anzugeben, das der Benutzer gefragt hat, und nicht nur "dort lesen" (wo es übrigens jede Menge Informationen gibt). Stackoverflow ist nicht beliebt, weil es Links zu externer Dokumentation enthält, sondern Antworten auf Fragen
Daniel Garmoshka
Gibt es eine Möglichkeit, "genaue Übereinstimmung" zu erzielen? Derzeit ist das Verhalten "von Anfang an übereinstimmend", daher %Ystimmt es sowohl 2015(wie erwartet) als auch zu, 2016-foo-barda es stoppt, wenn es angezeigt wird 2016. Dieses Verhalten stimmt mit dem C-Gegenstück überein. Die C-Funktion gibt jedoch die Position des Abgleichsendes zurück (z. B. die erste -im Fall "2016"), damit wir entscheiden können, ob die Übereinstimmung genau ist. In Ruby wird a zurückgegeben DateTime, sodass wir nicht sagen können, ob danach noch etwas vorhanden ist.
Franklin Yu
97

Sollte das nicht auch funktionieren?

"30/Nov/2009 16:29:30 +0100".to_datetime
xentek
quelle
1
funktioniert gut in Rails 3.2.3 mit Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => Mi, 16. Mai 2012 02:30:00 +0000
Tilo
58
Dies ist auch eine Ruby on Rails-Methode, keine Ruby-Methode.
JackCA
5
Dies sollte sein: require 'active_support/all' und dann "30/Nov/2009 16:29:30 +0100".to_datetime (Sie brauchen eigentlich nicht alle active_support-Erweiterungen, aber viel Glück beim Herausfinden, welche selektiv benötigt werden)
Matt Zukowski
2
ActiveSupport ist ziemlich vernünftig angelegt, aber für die geringste Auswirkung sollte dies alles sein, was Sie brauchen, um Objekten to_datetimehinzugefügt zu Stringwerden:require 'active_support/core_ext/string/conversions'
xentek
3
Die Frage bezieht sich auf "30 / Nov / 2009: 16: 29: 30 +0100" und nicht auf "30 / Nov / 2009 16:29:30 +0100". Das ist ein weiterer Grund, warum es nicht funktioniert.
schmijos
45

Ich hatte Erfolg mit:

require 'time'
t = Time.parse(some_string)
Automatico
quelle
15

Ich habe verwendet Time.parse("02/07/1988"), wie einige der anderen Plakate.

Ein interessantes Problem war, dass Timees beim Öffnen von IRB standardmäßig geladen wurde, aber Time.parsenicht definiert wurde. Ich musste require 'time'es zum Laufen bringen.

Das ist mit Ruby 2.2.

deklarieren
quelle
12

Dadurch wird die Zeichenfolge in Datum in Datum / Uhrzeit konvertiert:

"05/05/2012".to_time
user1425976
quelle
20
Dies ist eine Ruby on Rails-Methode, keine Ruby-Methode.
JackCA
1
Obwohl dies nicht die Antwort auf diese Frage war, hat es mir sehr geholfen. Danke @ user1425976
Karlingen
10

Für chinesische Rails-Entwickler:

DateTime.strptime('2012-12-09 00:01:36', '%Y-%m-%d %H:%M:%S')
=> Sun, 09 Dec 2012 00:01:36 +0000
Siwei Shen 申思维
quelle
5

In Ruby 1.8 konvertiert das ParseDate-Modul dieses und viele andere Datums- / Zeitformate. Es wird jedoch nicht elegant mit dem Doppelpunkt zwischen dem Jahr und der Stunde umgegangen. Angenommen, der Doppelpunkt ist ein Tippfehler und tatsächlich ein Leerzeichen, dann:

#!/usr/bin/ruby1.8

require 'parsedate'

s = "30/Nov/2009 16:29:30 +0100"
p Time.mktime(*ParseDate.parsedate(s))    # =>  Mon Nov 30 16:29:30 -0700 2009
Wayne Conrad
quelle
0

Sie können auch eine Datums- / Zeitzeichenfolge mit einer bestimmten Zeitzone analysieren:

zone = "Pacific Time (US & Canada)"
ActiveSupport::TimeZone[zone].parse("2020-05-24 18:45:00")
=> Sun, 24 May 2020 18:45:00 PDT -07:00
KM Rakibul Islam
quelle