2009-08-18 12 views
4

Comment puis-je forcer la fonction Time.rfc2822 à cracher +0000?Forçage du fuseau horaire "+0000" pour RFC2822 fois dans Ruby

Ruby me permet de parser RFC2822 fois assez facilement au format:

require 'time' 
time = Time.parse('14 Aug 2009 09:28:32 +0000') 
puts time 
=> "2009-08-14 05:28:32 -0400" 

Mais qu'en affichage temps? Notez que l'heure à laquelle il est analysé est une heure locale. Pas de soucis, je peux le reconvertir en un temps UTC avec gmtime:

puts time.gmtime 
=> "2009-08-14 09:28:32 UTC" 

Je peux ensuite le remettre au format RFC2822:

puts time.gmtime.rfc2822 
=> "Fri, 14 Aug 2009 09:28:32 -0000" 

Malheureusement, ce n'est pas tout à fait ce que je veux. Notez que +0000 est maintenant -0000. Selon RFC2822, c'est parce que:

La forme « +0000 » DEVRAIT être utilisé pour indiquer un fuseau horaire à temps universel. Bien que "-0000" indique aussi l'heure universelle, indique que l'heure a été générée sur un système dans un fuseau horaire autre que l'heure universelle. Par conséquent, indique que la date et l'heure ne contiennent aucune information sur le fuseau horaire local .

Grande - Comment puis-je forcer +0000 autre que le singe-patcher la fonction rfc2822?

+0

Si vous définissez le fuseau horaire en heure universelle avant d'appeler gmtime.rfc2882 obtenez-vous la sortie appropriée? Il semble que cela rapporte ce qu'il devrait rapporter, car je pense que Time.zone devrait être défini sur votre zone locale, par défaut. –

+0

Je ne sais pas exactement ce que vous voulez dire. Cependant, j'ai trouvé que la classe DateTime est beaucoup plus agréable; 'DateTime.parse ('14 août 2009 09:28:32 +0000 '). Rfc2822' rendements' "Fri, 14 Aug 2009 09:28:32 +0000" '. – Bkkbrad

+0

Mon garçon, c'est étrange ... et oui: ma réflexion sur le fuseau horaire s'est un peu embrouillée. Visser dans la console pour trouver quelque chose pour vous aider à me redresser ... ne m'a rien donné à partager avec vous, malheureusement. –

Répondre

3

Voilà ma solution monkey-patch:

class Time 
    alias_method :old_rfc2822, :rfc2822 
    def rfc2822 
    t = old_rfc2822 
    t.gsub!("-0000", "+0000") if utc? 
    t 
    end 
end 

Si vous avez une solution non-monkey-patch, je amour pour le voir!

0

façon la plus simple si vous n'avez pas besoin d'utiliser sur plusieurs endroits

Time.now.gmtime.rfc2822.sub(/(-)(0+)$/, '+\2') 
=> "Fri, 31 Mar 2017 08:39:04 +0000" 

ou une version de la méthode statique (singleton)

require 'time' 
module MyCustomTimeRFC 
    def custom_rfc2822(time) 
    time.gmtime.rfc2822.sub(/(-)(0+)$/, '+\2') 
    end 

    module_function :custom_rfc2822 
end 

t = Time.now 
p MyCustomTimeRFC.custom_rfc2822(t) 
#=> "Fri, 31 Mar 2017 08:43:15 +0000" 

ou extension de module si vous aimez le style oop avec une souplesse rubis.

require 'time' 
module MyCustomTimeRFC 
    def custom_rfc2822 
    gmtime.rfc2822.sub(/(-)(0+)$/, '+\2') 
    end 
end 

t = Time.now 
t.extend(MyCustomTimeRFC) 
p t.custom_rfc2822 
#=> "Fri, 31 Mar 2017 08:43:15 +0000" 
Questions connexes