2009-09-15 6 views
0

J'ai une application Rails pour les groupes. Les groupes peuvent importer leurs émissions qui se déroulent toutes dans des fuseaux horaires différents. Cela semble être une tonne de travail pour stocker ces événements en UTC. Je devrais trouver le fuseau horaire pour n'importe quel spectacle créé et puis reconvertir au fuseau horaire local de l'exposition en affichant à l'utilisateur. Existe-t-il un simple plugin pour obtenir un décalage UTC basé sur la géolocalisation? Cela aiderait probablement, mais est-ce que quelqu'un voit des raisons principales pour lesquelles je devrais stocker dans UTC ici? Je comprends que stocker des horodatages dans UTC est probablement une bonne idée ... mais les temps de l'événement de groupe?Comment gérer les fuseaux horaires d'une application Rails avec des événements

Répondre

4

Je travaille sur quelque chose de similaire - un site avec une liste d'événements. Dans ma situation, il est important que les temps soient standardisés (en UTC) parce que nous avons des temps d'annonce et de vente à craindre (c'est-à-dire quand les événements apparaissent sur le site et quand les liens en vente apparaissent). l'affichage de l'heure de début de l'événement (qui lui-même ne se soucie pas du fuseau horaire dans lequel il se trouve). Passer d'une heure UTC dans la base de données à l'heure locale du lieu donné (c'est-à-dire, afficher l'heure locale dans la liste des événements) est assez simple en utilisant quelque chose du type e.start.in_time_zone("#{e.venue.time_zone}"). Ce que je ne pouvais pas comprendre, c'était que l'heure locale au moment de la saisie des données soit reconnue comme une heure locale à convertir en UTC, sans avoir à changer de Time.zone.

J'ai trouvé quelque chose qui fonctionne. Découvrez ce post: http://steveluscher.com/archives/changing-a-times-zone-in-rails-keeping-the-same-local-representation. J'ai ajouté un nouveau fichier (time_zone_support.rb) à mon répertoire config/initializers. Voici le contenu:

module ActiveSupport 
    class TimeWithZone 
    def zone=(new_zone = ::Time.zone) 
     # Reinitialize with the new zone and the local time 
     initialize(nil, ::Time.__send__(:get_zone, new_zone), time) 
    end 
    end 
end 

Cela permet à la suivante dans la console:

>> e.starts = Time.zone.parse("2010-09-12 10:00 am") 
=> Sun, 12 Sep 2010 10:00:00 UTC +00:00 
>> e.starts.zone = e.time_zone 
=> "Pacific Time (US & Canada)" 
>> e.starts 
=> Sun, 12 Sep 2010 10:00:00 PDT -07:00 
>> e.save 
=> true 

Espérons que vous aide aussi!

+1

FYI, cela ne fonctionne plus parce que get_zone a été retiré de Time –

+2

Ceci est ce que j'utilise dans Rails 3.2.8: def same_time_of_day_in_time_zone (zone = :: Time.zone) ActiveSupport :: TimeWithZone.new (nil,: : Time.find_zone! (Zone), auto) fin –

-1

une façon de le faire est de les stocker tous dans utc puis laisser l'utilisateur décider quel est le fuseau qu'ils veulent les voir dans.

+0

J'allais demander pourquoi cela a -1. Puis j'ai vu que la page liée est en tchèque ou quelque chose. – Dan

1

Vous n'avez pas à vous soucier de UTC ici, puisque l'événement est lié à l'heure et au lieu où cela se produit. Si quelqu'un voyage d'Hawaï à San Francisco pour un spectacle de 20h, cela ne signifie pas que le spectacle commence à 16h pour eux. Donc, vous pouvez stocker l'heure et l'emplacement, ne vous inquiétez pas de TZ (puisque les bandes ont probablement un temps et un emplacement) et le stocker comme ça dans le db.

En ce qui concerne Rails, tous les événements se produiront dans le TZ dans lequel il existe, juste avec cet attribut drôle de "localisation" qui indique au lecteur que l'événement est vraiment 1000mi away. Cela signifie qu'il peut faire ses conversions auto-TZ normales pour lui-même, mais le lecteur ne sera pas en mesure de le dire. Il sera juste convertir au temps-comme-entré par le groupe en premier lieu. 20h + "Los Angeles", 22h + "Tulsa, OK." Le seul problème ici est de savoir si les émissions sont diffusées sur Internet ou quelque chose comme ça, où l'emplacement est découplé de l'événement, dans lequel vous feriez toujours ce qui précède, mais laissez le spectateur/potentiel-public-membre choisir leur propre TZ (ou géolocaliser eux) et ont l'application faire la conversion sur l'affichage dans la vue.

Questions connexes