rwb rwb - 3 months ago 15
Ruby Question

Ruby / Rails - How do i change the timezone of a Time, without changing the time

I have a record in the database which has

:start_time
and
:timezone
attributes.

The
:start_time
is a Time, with zone UTC - '2001-01-01 14:20:00', for example.
The
:timezone
is a string - 'America/New_York', for example.

I want to create a new time object with
:start_time
but whose timezone is
:timezone
. I do not want to load the
:start_time
and then convert to
:timezone
, because Rails will be clever and update the time from UTC to be consistent with that timezone.

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


Instead, i want to see

=> Sat, 01 Jan 2000 14:20:00 EST -05:00


ie. i want to say

t
=> 2000-01-01 14:20:00 UTC
t.zone = "America/New_York"
=> "America/New_York"
t
=> 2000-01-01 14:20:00 EST

Answer

Sounds like you want something along the lines of

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

This says convert this local time (using the zone) to utc. If you have Time.zone set then you can of course to

Time.zone.local_to_utc(t)

This won't use the timezone attached to t - it assumes that it's local to the time zone you are converting from.

One edge case to guard against here is DST transitions: the local time you specify may not exist or may be ambiguous.

Comments