I am building a Sinatra site which has mixed UTC/PST data sources, but will be viewed in PST. So I need a way to easily convert Time objects from UTC to PST. Without Rails, I d
Get the current time in utc, then add the offset:
Time.now.utc + Time.zone_offset('PDT')
#=> 2015-12-01 18:10:07 UTC
The problem here is that PDT
is fixed to -8
, PST
is fixed to -7
and Pacific Zone (one that adjusts between the two based on time of year and daylight savings) does not exist, for that you likely need ActiveSupport.
I recently did the same thing on an iron.io worker which default time is UTC
# For generality/testing, only require what you need.
require 'active_support/all'
# Set the Timezone
Time.zone = "Asia/Hong_Kong"
t = Time.zone.now
#=> 2015-01-20 16:44:58 +0800
For info on the supported Timezones take a look at ActiveSupport http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
You can use the Time
extensions from Active Support outside of Rails:
require 'active_support/core_ext/time'
t = Time.now
#=> 2014-08-15 15:38:56 +0200
t.in_time_zone('Pacific Time (US & Canada)')
#=> Fri, 15 Aug 2014 06:38:56 PDT -07:00
Now you can do
class Time
def to_pst
in_time_zone('Pacific Time (US & Canada)')
end
end
t = Time.now
#=> 2014-08-15 15:42:39 +0200
t.to_i
#=> 1408110159
t.to_pst
#=> Fri, 15 Aug 2014 06:42:39 PDT -07:00
t.to_pst.to_i
#=> 1408110159
# timestamp does not change!
Additionally you might also want the time extensions on Numeric
and Date
:
require 'active_support/core_ext/date'
require 'active_support/core_ext/numeric/time'
2.days.from_now
#=> 2014-08-17 15:42:39 +0200
In Pure Ruby
Time.now.utc.localtime("+05:30")
where +05:30 (IST) is the offset of the particular zone
If you don't want to load a ton of libraries, and if you don't mind doing it the poor man's way, and you know your offset is -8 for example, you can subtract 8*3600 seconds to get the new time. For example,
offset=-8
t = Time.now + offset * 3600
You'll need to adjust for day light savings time yourself though, also this doesn't change the time zone so %z won't be right.