A Time-like class that can represent a time in any time zone. Necessary
because standard Ruby Time instances are limited
to UTC and the system’s ENV['TZ']
zone.
You shouldn’t ever need to create a TimeWithZone instance directly via
new
. Instead use methods local
,
parse
, at
and now
on TimeZone instances, and in_time_zone
on Time and DateTime instances.
Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' Time.zone.local(2007, 2, 10, 15, 30, 45) # => Sat, 10 Feb 2007 15:30:45 EST -05:00 Time.zone.parse('2007-02-10 15:30:45') # => Sat, 10 Feb 2007 15:30:45 EST -05:00 Time.zone.at(1170361845) # => Sat, 10 Feb 2007 15:30:45 EST -05:00 Time.zone.now # => Sun, 18 May 2008 13:07:55 EDT -04:00 Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone # => Sat, 10 Feb 2007 15:30:45 EST -05:00
See Time and TimeZone for further documentation of these methods.
TimeWithZone instances implement the same API as Ruby Time instances, so that Time and TimeWithZone instances are interchangeable.
t = Time.zone.now # => Sun, 18 May 2008 13:27:25 EDT -04:00 t.hour # => 13 t.dst? # => true t.utc_offset # => -14400 t.zone # => "EDT" t.to_s(:rfc822) # => "Sun, 18 May 2008 13:27:25 -0400" t + 1.day # => Mon, 19 May 2008 13:27:25 EDT -04:00 t.beginning_of_year # => Tue, 01 Jan 2008 00:00:00 EST -05:00 t > Time.utc(1999) # => true t.is_a?(Time) # => true t.is_a?(ActiveSupport::TimeWithZone) # => true
- #
- A
- B
- C
- D
- E
- F
- G
- H
- I
- K
- L
- M
- N
- P
- R
- S
- T
- U
-
- usec,
- utc,
- utc?,
- utc_offset
- X
- Z
- Comparable
[R] | time_zone |
Report class name as ‘Time’ to thwart type checking.
# File activesupport/lib/active_support/time_with_zone.rb, line 247 def +(other) # If we're adding a Duration of variable length (i.e., years, months, days), move forward from #time, # otherwise move forward from #utc, for accuracy when moving across DST boundaries if duration_of_variable_length?(other) method_missing(:+, other) else result = utc.acts_like?(:date) ? utc.since(other) : utc + other rescue utc.since(other) result.in_time_zone(time_zone) end end
# File activesupport/lib/active_support/time_with_zone.rb, line 258 def -(other) # If we're subtracting a Duration of variable length (i.e., years, months, days), move backwards from #time, # otherwise move backwards #utc, for accuracy when moving across DST boundaries if other.acts_like?(:time) utc.to_f - other.to_f elsif duration_of_variable_length?(other) method_missing(:-, other) else result = utc.acts_like?(:date) ? utc.ago(other) : utc - other rescue utc.ago(other) result.in_time_zone(time_zone) end end
Use the time in UTC for comparisons.
So that self
acts_like?(:time)
.
# File activesupport/lib/active_support/time_with_zone.rb, line 285 def advance(options) # If we're advancing a value of variable length (i.e., years, weeks, months, days), advance from #time, # otherwise advance from #utc, for accuracy when moving across DST boundaries if options.values_at(:years, :weeks, :months, :days).any? method_missing(:advance, options) else utc.advance(options).in_time_zone(time_zone) end end
Coerces time to a string for JSON encoding. The
default format is ISO 8601. You can get %Y/%m/%d %H:%M:%S +offset style by
setting
ActiveSupport::JSON::Encoding.use_standard_json_time_format
to
false
.
# With ActiveSupport::JSON::Encoding.use_standard_json_time_format = true Time.utc(2005,2,1,15,15,10).in_time_zone.to_json # => "2005-02-01T15:15:10Z" # With ActiveSupport::JSON::Encoding.use_standard_json_time_format = false Time.utc(2005,2,1,15,15,10).in_time_zone.to_json # => "2005/02/01 15:15:10 +0000"
Returns true if the current object’s time is within the specified
min
and max
time.
Returns true if the current time is within Daylight Savings Time for the specified time zone.
Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' Time.zone.parse("2012-5-30").dst? # => true Time.zone.parse("2012-11-30").dst? # => false
Returns a formatted string of the offset from UTC, or an alternative string if the time zone is already UTC.
Time.zone = 'Eastern Time (US & Canada)' # => "Eastern Time (US & Canada)" Time.zone.now.formatted_offset(true) # => "-05:00" Time.zone.now.formatted_offset(false) # => "-0500" Time.zone = 'UTC' # => "UTC" Time.zone.now.formatted_offset(true, "0") # => "0"
Returns true if the current object’s time is in the future.
Returns a string of the object’s date and time in the format used by HTTP requests.
Time.zone.now.httpdate # => "Tue, 01 Jan 2013 04:39:43 GMT"
Returns the simultaneous time in Time.zone
, or the specified
zone.
Returns a Time.local()
instance of the simultaneous time in
your system’s ENV['TZ']
zone.
Send the missing method to time
instance, and wrap result in a
new TimeWithZone with the existing
time_zone
.
Returns true if the current object’s time is in the past.
Returns the underlying TZInfo::TimezonePeriod.
Ensure proxy class responds to all methods that underlying time instance responds to.
# File activesupport/lib/active_support/time_with_zone.rb, line 359 def respond_to_missing?(sym, include_priv) # consistently respond false to acts_like?(:date), regardless of whether #time is a Time or DateTime return false if sym.to_sym == :acts_like_date? time.respond_to?(sym, include_priv) end
Returns a string of the object’s date and time in the RFC 2822 standard format.
Time.zone.now.rfc2822 # => "Tue, 01 Jan 2013 04:51:39 +0000"
# File activesupport/lib/active_support/time_with_zone.rb, line 271 def since(other) # If we're adding a Duration of variable length (i.e., years, months, days), move forward from #time, # otherwise move forward from #utc, for accuracy when moving across DST boundaries if duration_of_variable_length?(other) method_missing(:since, other) else utc.since(other).in_time_zone(time_zone) end end
Replaces %Z
and %z
directives with
zone
and formatted_offset
, respectively, before
passing to Time#strftime, so that zone information is correct
:db
format outputs time in UTC; all others output time in
local. Uses TimeWithZone's strftime
, so %Z
and
%z
work correctly.
# File activesupport/lib/active_support/time_with_zone.rb, line 190 def to_s(format = :default) if format == :db utc.to_s(format) elsif formatter = ::Time::DATE_FORMATS[format] formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter) else "#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}" # mimicking Ruby 1.9 Time#to_s format end end
Returns true if the current object’s time falls within the current day.
Returns true if the current time zone is set to UTC.
Time.zone = 'UTC' # => 'UTC' Time.zone.now.utc? # => true Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' Time.zone.now.utc? # => false
Returns the offset from current time to UTC time in seconds.