Mam sygnaturę czasową w UTC
„2010-10-25 23:48:46 UTC”
Muszę przekonwertować go na ISO 8601
„2010-10-29 06: 09Z”
Dokumentacja jest myląca jak diabli - jak to zrobić najłatwiej?
Odpowiedzi:
Myślę, że próbujesz nas oszukać.
Data wejściowa pytania to 25 października 2010 r. , A data wyjściowa to 29 października 2010 r . Dobrze rozegrane!
Kontynuując ten wątek szukania nitek: twoje czasy są również zupełnie inne i brakuje ci sekund z czasu wyjściowego.
A teraz prawdziwa odpowiedź.
Najpierw jednak mały fakt: wynik ISO 8601 w Rubim jest podobny do wyniku „Połączonej daty i godziny” ze strony Wikipedii ISO 8601 .
Masz ciąg, więc musisz przekształcić go w Time
obiekt, z którym możesz zrobić to_time
. Wtedy wystarczy wywołać iso8601
ten obiekt, aby uzyskać wersję ISO 8601:
"2010-10-25 23:48:46 UTC".to_time.iso8601
to_time
Metoda jest dzięki uprzejmości Rails, natomiast iso8601
dzięki uprzejmości biblioteki standardowej Rubiego.
Po wielu eksperymentach stwierdziłem, że parser biblioteki Time jest lepszy niż DateTime, chociaż powody mi umykają w tej chwili. Z tym zastrzeżeniem, zawsze używam Time zamiast DateTime do tego rodzaju rzeczy, a dokumentacja Ruby jest również trudna do zrozumienia, dlaczego tak jest,
require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
Time.parse("...").utc.iso8601
razie otrzymasz czas z sufiksem +03:00
lub inną wartość w zależności od oryginalnego ciągu czasu strefy czasowej. Mam na myśli zamiast Z
.
Uwaga: przed zastosowaniem metody to_time musisz przekonwertować (przeanalizować) ciąg czasu na obiekt czasu.
ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
from (irb):16
Prawidłowa procedura:
irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")
irb> ut.iso8601
=> "2010-10-25T23:48:46+00:00"
Dodanie odpowiedzi na to bardzo stare pytanie, ponieważ jeśli używasz Railsów, nie ma potrzeby konwertowania / analizowania go w sposób, w jaki radzą Ci inne odpowiedzi:
created_at
lub updated_at
), możesz bezpośrednio wywołać iso8601
metodę z tym znacznikiem czasu (np object.created_at.iso8601
.).iso8601
Sposób przyjmuje również liczbową argumentu wyświetlenie cyfry ułamkowe; użyłbyś tego, jeśli chcesz 2020-04-06T19:16:55.604Z
zamiast 2020-04-06T19:16:55Z
.https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601