Ho un timestamp che è in UTC
"2010-10-25 23:48:46 UTC"
Devo convertirlo in ISO 8601
"2010-10-29 06: 09Z"
La documentazione è confusa da morire: qual è il modo più semplice per farlo?
Risposte:
Penso che tu stia cercando di ingannarci.
La data di input alla tua domanda è il 25 ottobre 2010 , mentre l'uscita è il 29 ottobre 2010 . Ben fatto!
Continuando su questo thread pignolo: anche i tuoi tempi sono completamente diversi e ti mancano i secondi dal tempo di uscita.
Ora per la vera risposta.
Prima un po 'di fatto: l'output ISO 8601 in Ruby è simile all'output "Data e ora combinate" dalla pagina Wikipedia di ISO 8601 .
Hai una stringa e quindi dovrai convertirla in un Timeoggetto che puoi utilizzare to_time. Quindi è semplicemente una questione di chiamare iso8601quell'oggetto per ottenere la versione ISO 8601:
"2010-10-25 23:48:46 UTC".to_time.iso8601
Il to_timemetodo è per gentile concessione di Rails, mentre il iso8601è per gentile concessione della libreria standard di Ruby.
Dopo molti esperimenti, trovo che il parser della libreria Time sia migliore di DateTime, anche se le ragioni mi sfuggono al momento. Con questo avvertimento, uso sempre Time anziché DateTime per questo tipo di cose, e anche la documentazione di ruby è difficile da capire perché è così,
require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
Time.parse("...").utc.iso8601:, altrimenti avrai il suffisso con l'ora +03:00o qualche altro valore a seconda del fuso orario con cui è stata data la stringa dell'ora originale. Voglio dire invece di Z.
Nota: è necessario convertire (analizzare) una stringa temporale in un oggetto tempo prima di poter applicare il metodo to_time.
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
Procedura corretta:
irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")
irb> ut.iso8601
=> "2010-10-25T23:48:46+00:00"
Aggiungendo una risposta a questa domanda super vecchia perché se stai usando Rails, non è necessario convertirlo / analizzarlo nel modo in cui le altre risposte qui ti dicono di fare:
created_ato updated_at), puoi chiamare direttamente il iso8601metodo su quel timestamp (ad es object.created_at.iso8601.).iso8601metodo accetta anche un argomento numerico per visualizzare cifre frazionarie; lo useresti se lo desideri 2020-04-06T19:16:55.604Zinvece di 2020-04-06T19:16:55Z.https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601