Reputation: 52540
I have users entering in dates in a Ruby on Rails website. I parse the dates into a DateTime object with something like:
date = DateTime.new(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i)
or
date = DateTime.parse(params[:date])
Both DateTime
s will not be in the time zone of the user which I previously set with something like:
Time.zone = "Pacific Time (US & Canada)"
How do I parse the above DateTime
s to be in the right time zone? I know the DateTime.new
method has a 7th argument for the time offset. Is there an easy way to look up the offset for a time zone in a given time? Or should I be using something other than DateTime
?
Upvotes: 35
Views: 70833
Reputation: 45943
Surprisingly none of these answers are very good.
DateTime now takes a 7th argument for time zone:
DateTime.new(2024, 7, 2, 6, 30, 0, 'PST')
EDIT:
Note that 'PST' and 'PDT' are different, and will yield different times.
Also, "Pacific Time (US & Canada)" does not work here, and returns UTC.
Upvotes: 0
Reputation: 438
You can use the following code to create a DateTime
object with your desired TimeZone
.
DateTime.new(2013, 6, 29, 10, 15, 30).change(:offset => "+0530")
With Ruby v1.9.1, the below line does the same job like a magic.
DateTime.new(2013, 6, 29, 10, 15, 30, "+0530")
Documentation here
Upvotes: 26
Reputation: 1447
DateTime.new
accepts optional offset argument (as the seventh) starting from ruby 1.9.1
We can write
DateTime.new(2018, 1, 1, 0, 0, 0, Time.zone.formatted_offset)
Upvotes: 8
Reputation: 8169
Try:
Time.zone = "Pacific Time (US & Canada)"
Time.zone.parse('8-11-2013 23:59:59') #=> Fri, 08 Nov 2013 23:59:59 PST -08:00
OR
Time.now.in_time_zone("Pacific Time (US & Canada)")
OR
DateTime.now.in_time_zone("Pacific Time (US & Canada)")
Upvotes: 43
Reputation: 690
If you have already a correct DateTime object with the name 'datetime', and you want to copy it, you can simply call the 'getutc' on it and after that use the 'in_time_zone'
DateTime.new(datetime.getutc.year, datetime.getutc.month, datetime.getutc.day, time.getutc.hour, time.getutc.min).in_time_zone
Upvotes: 1
Reputation:
You can use Time.zone.local
if you set Time.zone
previously:
user_time = Time.zone.local(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i, 0)
Have a look at the ActiveSupport::TimeWithZone
documentation.
Upvotes: 23