Class: TZInfo::DateTimeWithOffset

Inherits:
DateTime
  • Object
show all
Includes:
WithOffset
Defined in:
lib/tzinfo/datetime_with_offset.rb

Overview

A subclass of DateTime used to represent local times. DateTimeWithOffset holds a reference to the related TimezoneOffset and overrides various methods to return results appropriate for the TimezoneOffset. Certain operations will clear the associated TimezoneOffset (if the TimezoneOffset would not necessarily be valid for the result). Once the TimezoneOffset has been cleared, DateTimeWithOffset behaves identically to DateTime.

Arithmetic performed on DateTimeWithOffset instances is not time zone-aware. Regardless of whether transitions in the time zone are crossed, results of arithmetic operations will always maintain the same offset from UTC (offset). The associated TimezoneOffset will aways be cleared.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from WithOffset

#strftime

Instance Attribute Details

#timezone_offsetTimezoneOffset (readonly)

Returns the TimezoneOffset associated with this instance.

Returns:



24
25
26
# File 'lib/tzinfo/datetime_with_offset.rb', line 24

def timezone_offset
  @timezone_offset
end

Instance Method Details

#clear_timezone_offsetDateTimeWithOffset (protected)

Clears the associated TimezoneOffset.

Returns:



148
149
150
151
# File 'lib/tzinfo/datetime_with_offset.rb', line 148

def clear_timezone_offset
  @timezone_offset = nil
  self
end

#downto(min) ⇒ Object

An overridden version of DateTime#downto that clears the associated TimezoneOffset of the returned or yielded instances.



61
62
63
64
65
66
67
68
69
# File 'lib/tzinfo/datetime_with_offset.rb', line 61

def downto(min)
  if block_given?
    super {|dt| yield dt.clear_timezone_offset }
  else
    enum = super
    enum.each {|dt| dt.clear_timezone_offset }
    enum
  end
end

#englandDateTime

An overridden version of DateTime#england that preserves the associated TimezoneOffset.

Returns:

  • (DateTime)


75
76
77
78
79
# File 'lib/tzinfo/datetime_with_offset.rb', line 75

def england
  # super doesn't call #new_start on MRI, so each method has to be
  # individually overridden.
  if_timezone_offset(super) {|o,dt| dt.set_timezone_offset(o) }
end

#gregorianDateTime

An overridden version of DateTime#gregorian that preserves the associated TimezoneOffset.

Returns:

  • (DateTime)


85
86
87
88
89
# File 'lib/tzinfo/datetime_with_offset.rb', line 85

def gregorian
  # super doesn't call #new_start on MRI, so each method has to be
  # individually overridden.
  if_timezone_offset(super) {|o,dt| dt.set_timezone_offset(o) }
end

#italyDateTime

An overridden version of DateTime#italy that preserves the associated TimezoneOffset.

Returns:

  • (DateTime)


95
96
97
98
99
# File 'lib/tzinfo/datetime_with_offset.rb', line 95

def italy
  # super doesn't call #new_start on MRI, so each method has to be
  # individually overridden.
  if_timezone_offset(super) {|o,dt| dt.set_timezone_offset(o) }
end

#julianDateTime

An overridden version of DateTime#julian that preserves the associated TimezoneOffset.

Returns:

  • (DateTime)


105
106
107
108
109
# File 'lib/tzinfo/datetime_with_offset.rb', line 105

def julian
  # super doesn't call #new_start on MRI, so each method has to be
  # individually overridden.
  if_timezone_offset(super) {|o,dt| dt.set_timezone_offset(o) }
end

#new_start(start = Date::ITALY) ⇒ DateTime

An overridden version of DateTime#new_start that preserves the associated TimezoneOffset.

Returns:

  • (DateTime)


115
116
117
# File 'lib/tzinfo/datetime_with_offset.rb', line 115

def new_start(start = Date::ITALY)
  if_timezone_offset(super) {|o,dt| dt.set_timezone_offset(o) }
end

#set_timezone_offset(timezone_offset) ⇒ DateTimeWithOffset

Sets the associated TimezoneOffset.

Parameters:

Returns:

Raises:

  • (ArgumentError)

    if timezone_offset is nil.

  • (ArgumentError)

    if timezone_offset.observed_utc_offset does not equal self.offset * 86400.



34
35
36
37
38
39
# File 'lib/tzinfo/datetime_with_offset.rb', line 34

def set_timezone_offset(timezone_offset)
  raise ArgumentError, 'timezone_offset must be specified' unless timezone_offset
  raise ArgumentError, 'timezone_offset.observed_utc_offset does not match self.utc_offset' if offset * 86400 != timezone_offset.observed_utc_offset
  @timezone_offset = timezone_offset
  self
end

#step(limit, step = 1) ⇒ Object

An overridden version of DateTime#step that clears the associated TimezoneOffset of the returned or yielded instances.



121
122
123
124
125
126
127
128
129
# File 'lib/tzinfo/datetime_with_offset.rb', line 121

def step(limit, step = 1)
  if block_given?
    super {|dt| yield dt.clear_timezone_offset }
  else
    enum = super
    enum.each {|dt| dt.clear_timezone_offset }
    enum
  end
end

#to_timeTime

An overridden version of DateTime#to_time that, if there is an associated TimezoneOffset, returns a TZInfo::DateTimeWithOffset with that offset.

Returns:



48
49
50
51
52
53
54
55
56
57
# File 'lib/tzinfo/datetime_with_offset.rb', line 48

def to_time
  if_timezone_offset(super) do |o,t|
    # Ruby 2.4.0 changed the behaviour of to_time so that it preserves the
    # offset instead of converting to the system local timezone.
    #
    # When self has an associated TimezonePeriod, this implementation will
    # preserve the offset on all versions of Ruby.
    TimeWithOffset.at(t.to_i, t.subsec * 1_000_000).set_timezone_offset(o)
  end
end

#upto(max) ⇒ Object

An overridden version of DateTime#upto that clears the associated TimezoneOffset of the returned or yielded instances.



133
134
135
136
137
138
139
140
141
# File 'lib/tzinfo/datetime_with_offset.rb', line 133

def upto(max)
  if block_given?
    super {|dt| yield dt.clear_timezone_offset }
  else
    enum = super
    enum.each {|dt| dt.clear_timezone_offset }
    enum
  end
end