9
votes

Objet de la date de conversion à TimeWithzone

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


3 commentaires

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.


5 Réponses :


0
votes

quelque chose comme ce travail pour vous? XXX


0 commentaires

0
votes

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 }


0 commentaires

4
votes

Si vous avez temps.zone défini dans les rails, vous pouvez appeler date # at_beginning_of_day (voir http://api.rubyonrails.org/classes/date.html#method--at_beginning_of_day ). Contraste cela avec date # to_dateTime : xxx


2 commentaires

time.zone est threadsafe, il définit la zone dans thread.current [: time_zone] . 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;)



2
votes

Je recommande vivement de toute solution qui convertit la date à un temps en utilisant 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.

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>

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


0 commentaires

10
votes

Je suis en retard à la fête, mais c'est toujours une excellente question. ActiveSupport's's in_Time_Zone 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é): xxx

de Bien sûr, si vous voulez le début de la journée exprimé à l'UTC, vous pouvez le faire: xxx


0 commentaires