J'ai besoin de convertir un objet de date en un objet timewithzone représentant le début de cette journée dans un fuseau horaire donné.
L'approche suivante fonctionne, mais semble trop compliqué car elle lui oblige à convertir la date à une chaîne: P>
?> date.to_datetime.in_time_zone('Eastern Time (US & Canada)').beginning_of_day => Tue, 16 Feb 2010 00:00:00 EST -05:00
5 Réponses :
quelque chose comme ce travail pour vous?
Soustrayez UTC_OFFSET:
Time.zone.class.all.map(&:name).map { |tz| o = d.to_datetime.in_time_zone(tz).utc_offset - ActiveSupport::TimeZone[tz].utc_offset }
Si vous avez temps.zone code> défini dans les rails, vous pouvez appeler
date # at_beginning_of_day code> (voir
date # to_dateTime code>:
time.zone code> est b> threadsafe, il définit la zone dans
thread.current [: time_zone] code>. Source
Merci pour la correction, j'ai supprimé ce commentaire, mais j'ai laissé celui-ci pour que les gens ne pensent pas que tu es fou;)
Je recommande vivement de toute solution qui convertit la date à un temps en utilisant Utilisez le fuseau horaire lui-même qui a cette logique intégrée. Strong> p> donné une zone et un Date, vous pouvez obtenir un temps-ci pour le début de la journée, comme celui-ci: P> to_datetime code> ou
to_time code> car ces méthodes ignorent la zone et "code> in_time_zone sur le résultat, comme certaines réponses suggèrent, ne fixeront pas de manière rétroactive l'erreur. En outre, n'essayez pas de construire votre propre temps d'économie de jour en utilisant des compensations UTC. Vous êtes obligé de vous tromper, et vous faites du travail inutilement.
irb(main):009:0> zone = ActiveSupport::TimeZone['Eastern Time (US & Canada)']
=> (GMT-05:00) Eastern Time (US & Canada)
irb(main):010:0> t1 = zone.local(2013, 1, 1)
=> Tue, 01 Jan 2013 00:00:00 EST -05:00
irb(main):011:0> t2 = zone.local(2013, 5, 1)
=> Wed, 01 May 2013 00:00:00 EDT -04:00
irb(main):012:0> t1.utc_offset
=> -18000
irb(main):013:0> t2.utc_offset
=> -14400
Je suis en retard à la fête, mais c'est toujours une excellente question. ActiveSupport's's de Bien sûr, si vous voulez le début de la journée exprimé à l'UTC, vous pouvez le faire: p> in_Time_Zone CODE> a été introduit depuis l'OP, mais cela fait exactement ce que vous voulez sans analyser une chaîne (lente) ou un temps de réglage (risqué):
On dirait que votre solution pourrait être la bonne façon d'aller.
J'ai édité ma réponse pour surmonter cette question.
Donnez-vous la solution! =) Le temps avec les fuseaux horaires est toujours en désordre.