Conversione del timestamp UTC in ISO 8601 in Ruby


86

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:


187

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.


7
Buona risposta, ma non ho ricevuto la prima parte (doveva essere umorismo?)
Mark Thomas

5
Dannazione! avete visto il mio complotto per ingannarvi gente. = P Grazie per l'ottima risposta, mi chiedo perché non lo scrivano solo nella documentazione!
ming yeow

13
@ Mark Thomas: sì, doveva essere umorismo. Ha dato un input e un tempo di output che non avrebbero mai eguagliato. Piccolo hobbit ingannevole!
Ryan Bigg

Funziona, ma sebbene la sua domanda chiedesse come farlo in ruby, non presupponeva che fosse nell'ambiente rails.
courtimas

1
Correlati, grazie per avermi indicato i formati "to_time" ~ Time.now.iso8601 come "2010-10-25T23: 48: 46Z", se vuoi usare "+00: 00" invece di "Z" (che avevo a per un sistema legacy) Time.now.to_time.iso8601 sembra farlo.
lucygenik

21

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"

5
buona soluzione di rubino puro. Voglio solo aggiungere, se l'ora originale non è UTC, potresti volere questo 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.
akostadinov

4

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" 

1

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:

  • Se è già un timestamp (ad es. Un attributo created_ato updated_at), puoi chiamare direttamente il iso8601metodo su quel timestamp (ad es object.created_at.iso8601.).
  • Il 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.