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.