2009-08-20 5 views
2

Je dispose de toutes les informations de fuseau horaire nécessaires et enregistre toutes les informations correctement selon this railscast. Tout fonctionne bien pour tous les objectifs normaux comme l'affichage de l'heure dans une table, mais je me demande comment je peux convertir ce qui suit au current_users enregistré le fuseau horaire.ruby ​​on rails conversion au fuseau horaire des utilisateurs

J'ai trouve le nombre total d'appels par heure:

Calls.count(:group => DATE_PART('hour', start_time), 
      :conditions => ["start_time BETWEEN ? AND ?", start, finish] 

Cette requête tire dans tous tous les appels qui ont été faites en une heure entre le début et l'heure d'arrivée. La seule chose est que cela fait reculer l'heure dans la base de données qui est stockée en UTC. J'ai écrit ma propre petite méthode de conversion avec Time.now.utc_offset mais j'ai réalisé que cela ne fonctionnerait pas. Quel serait un bon moyen de comparer les utilisateurs enregistrés time_zone avec ce qui vient de la base de données et ajouter le utc_offset.

Le time_zone est stocké sous forme de chaîne dans la base de données heure de l'Est (Etats-Unis & Canada).

Quelle est la meilleure façon de comprendre cela, je peux changer pour enregistrer le décalage de l'utilisateur dans la base de données, mais avant de le faire, je voudrais voir s'il y a un moyen plus facile.

Modifier
Pour être plus clair, la requête renvoie un hachage d'heures et le nombre. Ainsi, par exemple:

   Hour      Count 
       "5"       20 
       "6"       15 
       "7"       35 
       ...       ... 

L'heure revient comme une heure UTC, décalage je dois convertir ce chiffre à la zone de temps des utilisateurs, donc par exemple, si elle est heure de l'Est (Etats-Unis et Canada), on boucle le hachage et ajouter -4 à l'heure.

Edit 2
Merci à Andy j'ai pu comprendre cela assez simplement. La première chose que vous voulez faire est de définir l'objet Time sur le fuseau horaire actuel des utilisateurs. Alors:

Time.zone = @current_user.time_zone 
=> "Eastern Time (US & Canada) 

Ajoutez ensuite le utilisateur courant de décalage à la « heure » dans le hachage

hour + Time.now.in_time_zone.utc_offset/3600 

Assez explicite, mais qui obtient le temps de la zone que vous définissez précédemment, et trouve l'UTC décalage en secondes, c'est pourquoi nous divisons par 3600.

+1

Pouvez-vous éclaircir un peu la question? Voulez-vous simplement spécifier les heures de début et de fin par rapport au fuseau horaire de l'utilisateur ou voulez-vous simplement convertir l'heure UTC dans le fuseau horaire de l'utilisateur une fois la requête effectuée? – klochner

+1

Convertir l'heure UTC au fuseau horaire de l'utilisateur après que la requête soit faite – Ryan

Répondre

4

Est-ce que cela aide? Celui qui a posté avant moi a supprimé sa réponse (c'était beaucoup mieux que ma réponse). S'il ramène sa réponse, je la reprends.

+0

Cela peut être suffisant pour que je puisse y aller, je vais mettre à jour dans un peu. – Ryan

+1

Cela a beaucoup aidé. Il m'a fallu dix minutes pour comprendre après m'avoir montré que je pouvais définir un objet temps avec le fuseau horaire de l'utilisateur. Voir ma modification pour voir ce que j'ai fait.La syntaxe est la seule chose qui soit vraiment différente. – Ryan

0
scope :opened, where("date > '#{Time.now.in_time_zone}'") 
scope :closed, where("date < '#{Time.now.in_time_zone}'")