J'ai un record foo
dans la base de données qui a :start_time
et des :timezone
attributs.
Le :start_time
est un temps en UTC -2001-01-01 14:20:00
, par exemple. Le :timezone
est une chaîne - America/New_York
, par exemple.
Je souhaite créer un nouvel objet Time avec la valeur de :start_time
mais dont le fuseau horaire est spécifié par:timezone
. Je ne veux pas charger :start_time
puis convertir en :timezone
, car Rails sera intelligent et mettra à jour l'heure UTC pour être cohérente avec ce fuseau horaire.
Actuellement,
t = foo.start_time
=> 2000-01-01 14:20:00 UTC
t.zone
=> "UTC"
t.in_time_zone("America/New_York")
=> Sat, 01 Jan 2000 09:20:00 EST -05:00
Au lieu de cela, je veux voir
=> Sat, 01 Jan 2000 14:20:00 EST -05:00
c'est à dire. Je veux faire:
t
=> 2000-01-01 14:20:00 UTC
t.zone = "America/New_York"
=> "America/New_York"
t
=> 2000-01-01 14:20:00 EST
Réponses:
On dirait que vous voulez quelque chose du genre
Cela dit convertir cette heure locale (en utilisant la zone) en utc. Si vous avez
Time.zone
défini, vous pouvez bien sûrCela n'utilisera pas le fuseau horaire associé à t - cela suppose qu'il est local par rapport au fuseau horaire à partir duquel vous effectuez la conversion.
Les transitions DST constituent un cas de pointe à éviter: l'heure locale que vous spécifiez peut ne pas exister ou être ambiguë.
la source
Time.use_zone(self.timezone) { Time.zone.local_to_utc(t) }.localtime
Je viens de faire face au même problème et voici ce que je vais faire:
Voici la documentation sur asctime
la source
asctime
est qu'il supprime toutes les valeurs en sous-secondes (que ma réponse conserve).Si vous utilisez Rails, voici une autre méthode dans le sens de la réponse d'Eric Walsh:
la source
.in_time_zone
à la fin.Time.zone.now
par quelque chose qui est le plus proche de l'heure à laquelle vous souhaitez changer fonctionnerait?Vous devez ajouter le décalage horaire à votre temps après l'avoir converti.
Le moyen le plus simple de procéder est:
Je ne sais pas pourquoi vous voudriez faire cela, bien qu'il soit probablement préférable de travailler avec les temps tels qu'ils sont construits. Je suppose que des informations sur les raisons pour lesquelles vous devez changer l'heure et les fuseaux horaires seraient utiles.
la source
Time.in_time_zone
en exigeant les parties correctes de active_support:require 'active_support/core_ext/time'
En fait, je pense que vous devez soustraire le décalage après l'avoir converti, comme dans:
la source
Cela dépend de l'endroit où vous allez utiliser ce temps.
Quand ton temps est un attribut
Si l'heure est utilisée comme attribut, vous pouvez utiliser la même gemme date_time_attribute :
Lorsque vous définissez une variable distincte
Utilisez le même gemme date_time_attribute :
la source
Petite fonction rapide que j'ai inventée pour résoudre le travail. Si quelqu'un a un moyen plus efficace de faire cela, veuillez le poster!
la source
La prémisse de l'OP est incorrecte: "Je ne veux pas charger le: start_time puis le convertir en: timezone, car Rails sera intelligent et mettra à jour l'heure UTC pour être cohérente avec ce fuseau horaire." Ce n'est pas nécessairement vrai, comme le montre la réponse fournie ici.
la source
t.zone
avantt.change
que vois-tu? Et quand vous courezt.zone
aprèst.change
? Et à quels paramètres passez-voust.change
exactement?J'ai créé quelques méthodes d'aide dont l'une fait la même chose que celle demandée par l'auteur original du message sur Ruby / Rails - Changer le fuseau horaire d'une heure, sans changer la valeur .
J'ai également documenté quelques particularités que j'ai observées et ces aides contiennent également des méthodes pour ignorer complètement les économies automatiques de lumière du jour applicables lors des conversions de temps qui ne sont pas disponibles prêtes à l'emploi dans le cadre de Rails:
Exemples qui peuvent être essayés sur la console rails ou un script ruby après avoir encapsulé les méthodes ci-dessus dans une classe ou un module:
J'espère que cela t'aides.
la source
Voici une autre version qui a mieux fonctionné pour moi que les réponses actuelles:
Il reporte les nanosecondes en utilisant "% N". Si vous désirez une autre précision, consultez cette référence strftime .
la source
J'ai également passé beaucoup de temps à me débattre avec TimeZones, et après avoir bricolé Ruby 1.9.3, j'ai réalisé que vous n'aviez pas besoin de convertir en un symbole de fuseau horaire nommé avant de convertir:
Ce que cela implique, c'est que vous pouvez vous concentrer sur l'obtention de la configuration de l'heure appropriée en premier dans la région que vous voulez, la façon dont vous y penseriez (au moins dans ma tête, je la partitionne de cette façon), puis convertissez à la fin de la zone vous souhaitez vérifier votre logique métier avec.
Cela fonctionne également pour Ruby 2.3.1.
la source