2011-10-03 3 views
2

Dans mon application Rails (3.0), j'utilise des fuseaux horaires en utilisant l'assistant time_zone_select(). Il génère des noms de fuseau horaire comme "(GMT + 01: 00) Paris" ...Rails timezones VS fuseaux horaires MySQL

Mais ces noms sont différents de ceux de MySQL, où le même fuseau horaire serait "Europe/Paris". Comment puis-je convertir les fuseaux horaires Rails en MySQL?

La partie la plus délicate est que pour plusieurs raisons que je ont d'utiliser la valeur par défaut Rails aide, et dans mes modèles, je ont d'utiliser les fuseaux horaires MySQL. Donc je ne peux pas utiliser les fuseaux horaires Ruby dans mes modèles, et je ne peux pas utiliser une liste de fuseaux horaires MySQL au lieu de l'assistant Rails ... J'ai vraiment besoin d'un moyen de convertir du premier au dernier.

Une idée?

Edit: J'essaie d'utiliser actuellement ActiveSupport :: TimeZone [(ruby_timezone)] .tzinfo.name, est-il une meilleure façon?

+0

Votre droit me semble, bien que je peut vous soucier de rails de support que MySQL ne timezones pas ... – Romain

+0

Romain: oui, je me demande la même chose ... Je pense que je vais tester chacun d'entre eux avec un * pour chaque * boucle. – Raphael

Répondre

4

D'accord, j'ai finalement trouvé un moyen:

ActiveSupport::TimeZone[ruby_timezone].tzinfo.name 

Romain a suggéré qu'il peut y avoir des Rails timezones non pris en charge par MySQL, donc je testé ce qui suit dans la console, et la réponse est la suivante: ils travaillent tous:

ActiveSupport::TimeZone.all.each do |ruby_timezone| 
    mysql_timezone = ActiveSupport::TimeZone[ruby_timezone.name].tzinfo.name 
    puts ActiveRecord::Base.connection.execute("select convert_tz('2011-01-01 00:00:00', 'UTC', '#{mysql_timezone}')").first 
    end 
end 

Si un fuseau horaire n'était pas supporté par MySQL, il aurait renvoyé zéro.

Je ne sais pas s'il y a une meilleure façon, mais au moins cela fonctionne :)