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 Time
oggetto che puoi utilizzare to_time
. Quindi è semplicemente una questione di chiamare iso8601
quell'oggetto per ottenere la versione ISO 8601:
"2010-10-25 23:48:46 UTC".to_time.iso8601
Il to_time
metodo è 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:00
o 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_at
o updated_at
), puoi chiamare direttamente il iso8601
metodo su quel timestamp (ad es object.created_at.iso8601
.).iso8601
metodo accetta anche un argomento numerico per visualizzare cifre frazionarie; lo useresti se lo desideri 2020-04-06T19:16:55.604Z
invece di 2020-04-06T19:16:55Z
.https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601