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.

Antworten:


99

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


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
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

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)

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.


12

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

"05/05/2012".to_time

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.