Conversion de l’horodatage UTC à ISO 8601 dans Ruby

J’ai un horodatage en UTC

“2010-10-25 23:48:46 UTC”

Je dois le convertir en ISO 8601

“2010-10-29 06: 09Z”

La documentation est déroutante comme l’enfer – quel est le moyen le plus simple de le faire?

Je pense que vous essayez de nous piéger.

La date de saisie de votre question est le 25 octobre 2010 , tandis que la sortie est le 29 octobre 2010 . Bien joué!

Continuez sur ce sujet: vos temps sont également complètement différents et vous manquez les secondes du temps de sortie.

Maintenant, pour la vraie réponse.

Une petite première en fait cependant: la sortie ISO 8601 en Ruby est similaire à la sortie “Date et heure combinées” de la page Wikipedia de l’ISO 8601 .

Vous avez une chaîne et vous devrez donc la convertir en un object Time que vous pouvez utiliser avec to_time . Ensuite, il suffit d’appeler iso8601 sur cet object pour obtenir la version ISO 8601:

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

La méthode to_time est une gracieuseté de Rails, tandis que l’ iso8601 est une gracieuseté de la bibliothèque standard de Ruby.

Après beaucoup d’expérimentation, je trouve que l’parsingur 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 de comprendre pourquoi,

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

Remarque: vous devez convertir (parsingr) une chaîne de temps en object time 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":Ssortingng 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"