I'm needing to convert a UTC time to the equivalent time in the user's time zone as part of a Rake task. What I want to do is change a UTC timestamp for midnight and re-create the timestamp to be midnight in the time zone of the user.
Example
Convert a UTC time
Wed, 01 Mar 2017 00:00:00 UTC +00:00
to Eastern Daylight Time (EDT) when observing daylight saving time (spring/summer)
Wed, 01 Mar 2017 04:00:00 UTC +00:00
zone = ActiveSupport::TimeZone.new("Eastern Time (US & Canada)")
time = "Wed, 01 Mar 2017 00:00:00 UTC +00:00"
time.in_time_zone(zone)
=> Tue, 28 Feb 2017 19:00:00.000000000 EST -05:00
The above will still save as Wed, 01 Mar 2017 00:00:00 UTC +00:00 in the database, as Rails will convert all timestamps back to UTC. However, I'm needing to get Wed, 01 Mar 2017 04:00:00 UTC +00:00 as that is the true beginning of the day in the user's time zone.
You can parse a string relative to a timezone via
ActiveSupport::TimeZone#parse. Just make sure to omit any time zone specifiers like "UTC +00:00":The last call to
utcis just for illustration purposes, Rails will perform this conversion automatically when savingtimeto the database.With numeric input: