87 votes

Conversion de l'horodatage UTC en ISO 8601 en Ruby

J'ai un horodatage en UTC

"2010-10-25 23:48:46 UTC"

J'ai besoin de le convertir en ISO 8601

"2010-10-29 06: 09Z"

La documentation est déroutante - quel est le moyen le plus simple de le faire?

190voto

Ryan Bigg Points 64561

Je pense que vous essayez de nous tromper.

La date d'entrée à votre question est que le 25 octobre 2010, tandis que la sortie est le 29 octobre 2010. Bien joué!

Continuer sur cette nit-picking fil de discussion: vos temps sont également totalement différentes et il vous manque les secondes à partir du moment de la sortie.

Maintenant, pour la vraie réponse.

Un petit factoid mais d'abord: la norme ISO 8601 sortie en Ruby, c'est similaire à la "combinaison de la date et de l'heure de sortie" de la norme ISO 8601 la page de Wikipedia.

Vous avez une chaîne de caractères et donc vous aurez besoin pour le convertir en Time objet que vous pouvez faire avec to_time. Ensuite, c'est simplement une question de faire appel iso8601 sur l'objet pour obtenir la norme ISO 8601 version:

"2010-10-25 23:48:46 UTC".to_time.iso8601

L' to_time méthode avec l'aimable autorisation de Rails, tandis que l' iso8601 est courtest de Ruby dans la bibliothèque standard.

21voto

Steeve McCauley Points 333

Après de nombreuses expériences, je trouve que l'analyseur syntaxique de la bibliothèque Time est meilleur que DateTime, bien que les raisons m'échappent pour le moment. Avec cette mise en garde, j'utilise toujours Time plutôt que DateTime pour ce genre de choses, et la documentation Ruby est également difficile à comprendre pour expliquer pourquoi.

 require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
 

4voto

Aerodame Points 21

Remarque: vous devez convertir (analyser) une chaîne temporelle en un objet temporel avant de pouvoir appliquer la méthode 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
 

Procédure correcte:

 irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")

irb> ut.iso8601
 => "2010-10-25T23:48:46+00:00" 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X