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?
źródło
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?
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"
źródło
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 zamiastZ
.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"
źródło
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
lubupdated_at
), możesz bezpośrednio wywołaćiso8601
metodę z tym znacznikiem czasu (npobject.created_at.iso8601
.).iso8601
Sposób przyjmuje również liczbową argumentu wyświetlenie cyfry ułamkowe; użyłbyś tego, jeśli chcesz2020-04-06T19:16:55.604Z
zamiast2020-04-06T19:16:55Z
.https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601
źródło