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.

Odpowiedzi:


100

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


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

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


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.


12

Spowoduje to przekonwertowanie ciągu w date na datetime:

"05/05/2012".to_time

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.