2010-04-08 16 views
0

Dans mon application, je dois définir une variable pour une heure de début à 9h00 locales, où que l'utilisateur se trouve.Comment puis-je obtenir une valeur pour l'heure à 9h00 locales, quel que soit le fuseau horaire?

J'ai une variable de fuseau horaire pour chaque utilisateur et la sauvegarde et la récupération fonctionnent tous. Mais je dois définir une variable lorsque je crée un nouvel événement à 9h00 dans le fuseau horaire de l'utilisateur.

Ma méthode actuelle utilise l'heure locale du serveur, puis effectue les réglages pour le fuseau horaire de chaque utilisateur. Je ne sais pas ce que je ne sais pas - y a-t-il une commande pour créer la valeur pour "La date d'aujourd'hui à 9h00 où vous êtes"?

Mon code actuel est:

t = Time.now.to_date.beginning_of_day + 11.hours 

(forçant 2 décalage horaire entre mon utilisateur principal et le serveur dans un fuseau horaire différent).

Répondre

0

Ruby a une classe de temps qui correspond à une classe de temps dans la plupart des bases de données. Dans la plupart des bases de données, y compris mysql, il est représenté par HH:mm:ss, donc la partie date est ignorée.

L'heure doit toujours rester la même (09:00) sauf si elle est modifiée de manière externe. Vous pouvez récupérer ces composants temporels en utilisant t.hour et t.min et construire un objet Date avec la date/heure correcte et le réglage du fuseau horaire de l'utilisateur.

>> t = Time.parse("09:00") 
=> 2010-04-07 09:00:00 -0700 
>> t.hour 
=> 9 
>> t.min 
=> 0 
+0

Cette méthode a fonctionné. Merci. Je me suis retrouvé avec: t = Time.parse ("09:00") start_time = Time.now.beginning_of_day + t.hour.hours – ander163

1

Avez-vous considéré le Ruby Timezone Library (TZInfo)? Il est sensible à la DST et plus étoffé que Rails' built-in TimeZone class.

Vous devez utiliser votre connaissance du fuseau horaire de l'utilisateur. Un exemple simple est ici:

require 'tzinfo' 
tz = TZInfo::Timezone.get('America/New_York') 
local = tz.utc_to_local(Time.utc(2010,4,8,9,0,0)) 

Ainsi, l'heure locale de 9h00 à EST/EDT est exprimée sous la forme 05:00 UTC.

irb(main):004:0> local.hour 
=> 5