web-dev-qa-db-fra.com

Conversion d'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

"29/10/2010 06: 09Z"

La documentation est déroutante - quelle est la façon la plus simple de le faire?

80
ming yeow

Je pense que vous essayez de nous tromper.

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

Poursuivant sur ce fil de sélection: vos temps sont également complètement différents et vous manquez les secondes du temps de sortie.

Maintenant pour la vraie réponse.

Un peu factoïde d'abord cependant: la sortie ISO 8601 dans Ruby est similaire à la sortie "Date et heure combinées" de page Wikipedia ISO 8601 .

Vous avez une chaîne et vous devrez donc la convertir en un objet Time que vous pouvez faire avec to_time. Il suffit ensuite d'appeler iso8601 sur cet objet pour obtenir la version ISO 8601:

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

Le to_time la méthode est une gracieuseté de Rails, tandis que le iso8601 est une gracieuseté de la bibliothèque standard de Ruby.

172
Ryan Bigg

Après de nombreuses expérimentations, je trouve que l'analyseur 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 pourquoi il en est ainsi,

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

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" 
3
Aerodame