Rails: convert UTC DateTime to another time zone
Solution 1:
time.in_time_zone(time_zone)
Example:
zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)
or just
Time.now.in_time_zone("Central Time (US & Canada)")
You can find the names of the ActiveSupport time zones by doing:
ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
Solution 2:
if Time.zone
it's your desired time zone then you can use @date.to_time.to_datetime
> @date
=> Tue, 02 Sep 2014 23:59:59 +0000
> @date.class
=> DateTime
> @date.to_time
=> 2014-09-02 12:59:59 -1100
> @date.to_time.to_datetime
=> Tue, 02 Sep 2014 12:59:59 -1100
Solution 3:
In plain ruby, with only require 'date'
, use the new_offset
method:
require 'date'
d=DateTime.parse('2000-01-01 12:00 +0200')
l=d.new_offset('-0700')
u=l.new_offset('UTC')
puts "#{u.strftime('%a %F %T %Z')} ❖ #{l.strftime('%a %F %T %Z')}"
Tested with ruby 2.3.7 that came standard on Mac OS X 10.13.
Solution 4:
Try ActiveSupport's TimeWithZone objects manipulated with TimeZone. ActiveSupport also provides the in_time_zone method for converting a UTC time to a specified TimeZone time zone. mckeed's answer shows the code.
Solution 5:
Just in case, if you are dealing with ActiveRecord object in Rails.
It might be a good idea to use Time.use_zone
for a per request basis timezone that overrides the default timezone set in config.time_zone
More details I explain at https://stackoverflow.com/a/25055692/542995