przekonwertuj String na DateTime

100

Muszę przeanalizować następujący ciąg do obiektu DateTime:
30/Nov/2009:16:29:30 +0100

Czy jest na to łatwy sposób?

PS: Chcę przekonwertować powyższy ciąg tak, jak jest. Dwukropek po roku nie jest literówką. Chcę też rozwiązać problem za pomocą Rubiego, a nie RoR.

SkaveRat
źródło

Odpowiedzi:

100

DateTime.strptime umożliwia określenie formatu i przekonwertowanie ciągu znaków na datę i godzinę.

Kaleb Brasee
źródło
1
dzięki. Nie udało mi się nadać jej własnego formatu. Oto działający: „% d /% b /% Y:% H:% M:% S”
SkaveRat
1
@SkaveRat Czy Twój ciąg znaków respektuje strefę czasową? Używam%d/%b/%Y:%H:%M:%S %Z
knut
4
Lista dostępnych skrótów formatów: gist.github.com/halloffame/5350249
Ryan,
9
Byłoby grzecznie podać przykład konwersji napisu, o który prosił użytkownik, a nie tylko „idź tam czytać” (przy okazji jest mnóstwo informacji). Stackoverflow jest popularny nie dlatego, że zawiera linki do zewnętrznej dokumentacji, ale daje odpowiedzi na pytania
Daniel Garmoshka
Czy istnieje sposób na „dopasowanie ścisłe”? Obecnie zachowanie jest „dopasowywane od początku”, więc %Ydopasuje zarówno 2015(zgodnie z oczekiwaniami), jak i 2016-foo-barponieważ zatrzymuje się, gdy zobaczy 2016. To zachowanie jest zgodne z odpowiednikiem C; jednak funkcja C zwraca pozycję końca dopasowania (np. pierwszą -w przypadku „2016”), abyśmy mogli zdecydować, czy dopasowanie jest dokładne; w Rubim zwraca a DateTime, więc nie możemy powiedzieć, czy coś jest dalej.
Franklin Yu
97

Czy to też nie powinno działać?

"30/Nov/2009 16:29:30 +0100".to_datetime
xentek
źródło
1
działa dobrze w Railsach 3.2.3 używając Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => środa, 16 maja 2012 02:30:00 +0000
Tilo
58
Jest to również metoda Ruby on Rails, a nie metoda Ruby.
JackCA,
5
To powinno być: require 'active_support/all' a potem "30/Nov/2009 16:29:30 +0100".to_datetime (właściwie nie potrzebujesz wszystkich rozszerzeń active_support, ale powodzenia w ustalaniu, które z nich wymagają selektywnie)
Matt Zukowski
2
ActiveSupport jest rozplanowany całkiem rozsądnie, ale dla najmniejszego wpływu powinno to wystarczyć, aby zostać to_datetimedodanym do Stringobiektów:require 'active_support/core_ext/string/conversions'
xentek
3
Pytanie dotyczy „30 / Lis / 2009: 16: 29: 30 +0100”, a nie „30 / Lis / 2009 16:29:30 +0100”. To kolejny powód, dla którego to nie działa.
schmijos
46

Odniosłem sukces z:

require 'time'
t = Time.parse(some_string)
Automatico
źródło
15

Użyłem Time.parse("02/07/1988"), podobnie jak niektórych innych plakatów.

Ciekawym rozwiązaniem było to, że Timezostało załadowane domyślnie, kiedy otworzyłem IRB, ale Time.parsenie zostało zdefiniowane. Musiałem, require 'time'żeby to zadziałało.

Tak jest w przypadku Rubiego 2.2.

declan
źródło
12

Spowoduje to przekonwertowanie ciągu w date na datetime:

"05/05/2012".to_time
user1425976
źródło
20
To jest metoda Ruby on Rails, a nie metoda Ruby.
JackCA,
1
Chociaż nie była to odpowiedź na to pytanie, bardzo mi pomogła. Dzięki @ user1425976
karlingen
11

Dla chińskich programistów Rails:

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

w Ruby 1.8 moduł ParseDate skonwertuje ten i wiele innych formatów daty / czasu. Jednak nie radzi sobie w pełni z okrężnicą między rokiem a godziną. Zakładając, że dwukropek jest literówką i faktycznie jest spacją, to:

#!/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
źródło
1

Możesz również przeanalizować ciąg daty i czasu z podaną strefą czasową:

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
źródło