Ruby / Rails – Modifiez le fuseau horaire d’une heure sans modifier la valeur

J’ai un enregistrement dans la firebase database qui contient :start_time et :timezone atsortingbutes.

Le :start_time est un temps dans UTC – 2001-01-01 14:20:00 , par exemple. Le :timezone est une chaîne – America/New_York , par exemple.

Je veux créer un nouvel object Time avec la valeur :start_time mais dont le fuseau horaire est spécifié par :timezone . Je ne souhaite pas charger :start_time , puis convertir en :timezone , car Rails sera intelligent et mettra à jour l’heure UTC pour être cohérent 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 

On dirait que vous voulez quelque chose dans le sens de

 ActiveSupport::TimeZone.new('America/New_York').local_to_utc(t) 

Cela dit convertir cette heure locale (en utilisant la zone) en utc. Si vous avez Time.zone défini, vous pouvez bien sûr

 Time.zone.local_to_utc(t) 

Cela n’utilisera pas le fuseau horaire attaché à t – cela suppose qu’il est local au fuseau horaire à partir duquel vous effectuez la conversion.

Les transitions d’heure d’été (DST) sont un exemple à suivre: l’heure locale que vous spécifiez peut ne pas exister ou être ambiguë.

Si vous utilisez Rails, voici une autre méthode similaire à celle d’Eric Walsh:

 def set_in_timezone(time, zone) Time.use_zone(zone) { time.to_datetime.change(offset: Time.zone.now.strftime("%z")) } end 

Je viens de faire face au même problème et voici ce que je vais faire:

 t = t.asctime.in_time_zone("America/New York") 

Voici la documentation sur asctime