File: //usr/local/rvm/gems/ruby-3.0.2/gems/tzinfo-2.0.4/lib/tzinfo/timezone_transition.rb
# encoding: UTF-8
# frozen_string_literal: true
module TZInfo
# Represents a transition from one observed UTC offset ({TimezoneOffset} to
# another for a time zone.
class TimezoneTransition
# @return [TimezoneOffset] the offset this transition changes to.
attr_reader :offset
# @return [TimezoneOffset] the offset this transition changes from.
attr_reader :previous_offset
# When this transition occurs as an `Integer` number of seconds since
# 1970-01-01 00:00:00 UTC ignoring leap seconds (i.e. each day is treated as
# if it were 86,400 seconds long). Equivalent to the result of calling the
# {Timestamp#value value} method on the {Timestamp} returned by {at}.
#
# @return [Integer] when this transition occurs as a number of seconds since
# 1970-01-01 00:00:00 UTC ignoring leap seconds.
attr_reader :timestamp_value
# Initializes a new {TimezoneTransition}.
#
# {TimezoneTransition} instances should not normally be constructed
# manually.
#
# @param offset [TimezoneOffset] the offset the transition changes to.
# @param previous_offset [TimezoneOffset] the offset the transition changes
# from.
# @param timestamp_value [Integer] when the transition occurs as a
# number of seconds since 1970-01-01 00:00:00 UTC ignoring leap seconds
# (i.e. each day is treated as if it were 86,400 seconds long).
def initialize(offset, previous_offset, timestamp_value)
@offset = offset
@previous_offset = previous_offset
@timestamp_value = timestamp_value
end
# Returns a {Timestamp} instance representing the UTC time when this
# transition occurs.
#
# To obtain the result as a `Time` or `DateTime`, call either
# {Timestamp#to_time to_time} or {Timestamp#to_datetime to_datetime} on the
# {Timestamp} instance that is returned.
#
# @return [Timestamp] the UTC time when this transition occurs.
def at
Timestamp.utc(@timestamp_value)
end
# Returns a {TimestampWithOffset} instance representing the local time when
# this transition causes the previous observance to end (calculated from
# {at} using {previous_offset}).
#
# To obtain the result as a `Time` or `DateTime`, call either
# {TimestampWithOffset#to_time to_time} or {TimestampWithOffset#to_datetime
# to_datetime} on the {TimestampWithOffset} instance that is returned.
#
# @return [TimestampWithOffset] the local time when this transition causes
# the previous observance to end.
def local_end_at
TimestampWithOffset.new(@timestamp_value, 0, @previous_offset.observed_utc_offset).set_timezone_offset(@previous_offset)
end
# Returns a {TimestampWithOffset} instance representing the local time when
# this transition causes the next observance to start (calculated from {at}
# using {offset}).
#
# To obtain the result as a `Time` or `DateTime`, call either
# {TimestampWithOffset#to_time to_time} or {TimestampWithOffset#to_datetime
# to_datetime} on the {TimestampWithOffset} instance that is returned.
#
# @return [TimestampWithOffset] the local time when this transition causes
# the next observance to start.
def local_start_at
TimestampWithOffset.new(@timestamp_value, 0, @offset.observed_utc_offset).set_timezone_offset(@offset)
end
# Determines if this {TimezoneTransition} is equal to another instance.
#
# @param tti [Object] the instance to test for equality.
# @return [Boolean] `true` if `tti` is a {TimezoneTransition} with the same
# {offset}, {previous_offset} and {timestamp_value} as this
# {TimezoneTransition}, otherwise `false`.
def ==(tti)
tti.kind_of?(TimezoneTransition) &&
offset == tti.offset && previous_offset == tti.previous_offset && timestamp_value == tti.timestamp_value
end
alias eql? ==
# @return [Integer] a hash based on {offset}, {previous_offset} and
# {timestamp_value}.
def hash
[@offset, @previous_offset, @timestamp_value].hash
end
end
end