tzinfo 1.2.7 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.yardopts +3 -0
- data/CHANGES.md +489 -382
- data/LICENSE +12 -12
- data/README.md +368 -114
- data/lib/tzinfo.rb +59 -29
- data/lib/tzinfo/country.rb +141 -129
- data/lib/tzinfo/country_timezone.rb +70 -112
- data/lib/tzinfo/data_source.rb +389 -144
- data/lib/tzinfo/data_sources.rb +8 -0
- data/lib/tzinfo/data_sources/constant_offset_data_timezone_info.rb +56 -0
- data/lib/tzinfo/data_sources/country_info.rb +42 -0
- data/lib/tzinfo/data_sources/data_timezone_info.rb +91 -0
- data/lib/tzinfo/data_sources/linked_timezone_info.rb +33 -0
- data/lib/tzinfo/data_sources/ruby_data_source.rb +145 -0
- data/lib/tzinfo/data_sources/timezone_info.rb +47 -0
- data/lib/tzinfo/data_sources/transitions_data_timezone_info.rb +214 -0
- data/lib/tzinfo/data_sources/zoneinfo_data_source.rb +577 -0
- data/lib/tzinfo/data_sources/zoneinfo_reader.rb +288 -0
- data/lib/tzinfo/data_timezone.rb +33 -47
- data/lib/tzinfo/datetime_with_offset.rb +153 -0
- data/lib/tzinfo/format1.rb +10 -0
- data/lib/tzinfo/format1/country_definer.rb +17 -0
- data/lib/tzinfo/format1/country_index_definition.rb +64 -0
- data/lib/tzinfo/format1/timezone_definer.rb +64 -0
- data/lib/tzinfo/format1/timezone_definition.rb +39 -0
- data/lib/tzinfo/format1/timezone_index_definition.rb +77 -0
- data/lib/tzinfo/format2.rb +10 -0
- data/lib/tzinfo/format2/country_definer.rb +68 -0
- data/lib/tzinfo/format2/country_index_definer.rb +68 -0
- data/lib/tzinfo/format2/country_index_definition.rb +46 -0
- data/lib/tzinfo/format2/timezone_definer.rb +94 -0
- data/lib/tzinfo/format2/timezone_definition.rb +73 -0
- data/lib/tzinfo/format2/timezone_index_definer.rb +45 -0
- data/lib/tzinfo/format2/timezone_index_definition.rb +55 -0
- data/lib/tzinfo/info_timezone.rb +26 -21
- data/lib/tzinfo/linked_timezone.rb +33 -52
- data/lib/tzinfo/offset_timezone_period.rb +42 -0
- data/lib/tzinfo/string_deduper.rb +118 -0
- data/lib/tzinfo/time_with_offset.rb +128 -0
- data/lib/tzinfo/timestamp.rb +548 -0
- data/lib/tzinfo/timestamp_with_offset.rb +85 -0
- data/lib/tzinfo/timezone.rb +989 -502
- data/lib/tzinfo/timezone_offset.rb +84 -74
- data/lib/tzinfo/timezone_period.rb +151 -217
- data/lib/tzinfo/timezone_proxy.rb +70 -79
- data/lib/tzinfo/timezone_transition.rb +77 -109
- data/lib/tzinfo/transitions_timezone_period.rb +63 -0
- data/lib/tzinfo/untaint_ext.rb +18 -0
- data/lib/tzinfo/version.rb +7 -0
- data/lib/tzinfo/with_offset.rb +61 -0
- metadata +42 -98
- metadata.gz.sig +0 -0
- data/Rakefile +0 -107
- data/lib/tzinfo/country_index_definition.rb +0 -31
- data/lib/tzinfo/country_info.rb +0 -42
- data/lib/tzinfo/data_timezone_info.rb +0 -55
- data/lib/tzinfo/linked_timezone_info.rb +0 -26
- data/lib/tzinfo/offset_rationals.rb +0 -77
- data/lib/tzinfo/ruby_core_support.rb +0 -169
- data/lib/tzinfo/ruby_country_info.rb +0 -74
- data/lib/tzinfo/ruby_data_source.rb +0 -140
- data/lib/tzinfo/time_or_datetime.rb +0 -340
- data/lib/tzinfo/timezone_definition.rb +0 -36
- data/lib/tzinfo/timezone_index_definition.rb +0 -54
- data/lib/tzinfo/timezone_info.rb +0 -30
- data/lib/tzinfo/timezone_transition_definition.rb +0 -104
- data/lib/tzinfo/transition_data_timezone_info.rb +0 -274
- data/lib/tzinfo/zoneinfo_country_info.rb +0 -37
- data/lib/tzinfo/zoneinfo_data_source.rb +0 -496
- data/lib/tzinfo/zoneinfo_timezone_info.rb +0 -300
- data/test/tc_country.rb +0 -238
- data/test/tc_country_index_definition.rb +0 -69
- data/test/tc_country_info.rb +0 -16
- data/test/tc_country_timezone.rb +0 -173
- data/test/tc_data_source.rb +0 -218
- data/test/tc_data_timezone.rb +0 -99
- data/test/tc_data_timezone_info.rb +0 -18
- data/test/tc_info_timezone.rb +0 -34
- data/test/tc_linked_timezone.rb +0 -155
- data/test/tc_linked_timezone_info.rb +0 -23
- data/test/tc_offset_rationals.rb +0 -23
- data/test/tc_ruby_core_support.rb +0 -168
- data/test/tc_ruby_country_info.rb +0 -110
- data/test/tc_ruby_data_source.rb +0 -167
- data/test/tc_time_or_datetime.rb +0 -660
- data/test/tc_timezone.rb +0 -1361
- data/test/tc_timezone_definition.rb +0 -113
- data/test/tc_timezone_index_definition.rb +0 -73
- data/test/tc_timezone_info.rb +0 -11
- data/test/tc_timezone_london.rb +0 -143
- data/test/tc_timezone_melbourne.rb +0 -142
- data/test/tc_timezone_new_york.rb +0 -142
- data/test/tc_timezone_offset.rb +0 -126
- data/test/tc_timezone_period.rb +0 -555
- data/test/tc_timezone_proxy.rb +0 -136
- data/test/tc_timezone_transition.rb +0 -366
- data/test/tc_timezone_transition_definition.rb +0 -295
- data/test/tc_timezone_utc.rb +0 -27
- data/test/tc_transition_data_timezone_info.rb +0 -433
- data/test/tc_zoneinfo_country_info.rb +0 -78
- data/test/tc_zoneinfo_data_source.rb +0 -1204
- data/test/tc_zoneinfo_timezone_info.rb +0 -1236
- data/test/test_utils.rb +0 -192
- data/test/ts_all.rb +0 -7
- data/test/ts_all_ruby.rb +0 -5
- data/test/ts_all_zoneinfo.rb +0 -9
- data/test/tzinfo-data/tzinfo/data.rb +0 -8
- data/test/tzinfo-data/tzinfo/data/definitions/America/Argentina/Buenos_Aires.rb +0 -89
- data/test/tzinfo-data/tzinfo/data/definitions/America/New_York.rb +0 -315
- data/test/tzinfo-data/tzinfo/data/definitions/Australia/Melbourne.rb +0 -218
- data/test/tzinfo-data/tzinfo/data/definitions/EST.rb +0 -19
- data/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__m__1.rb +0 -21
- data/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__p__1.rb +0 -21
- data/test/tzinfo-data/tzinfo/data/definitions/Etc/UTC.rb +0 -21
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/Amsterdam.rb +0 -261
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/Andorra.rb +0 -186
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/London.rb +0 -321
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/Paris.rb +0 -265
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/Prague.rb +0 -220
- data/test/tzinfo-data/tzinfo/data/definitions/UTC.rb +0 -16
- data/test/tzinfo-data/tzinfo/data/indexes/countries.rb +0 -927
- data/test/tzinfo-data/tzinfo/data/indexes/timezones.rb +0 -596
- data/test/tzinfo-data/tzinfo/data/version.rb +0 -14
- data/test/zoneinfo/America/Argentina/Buenos_Aires +0 -0
- data/test/zoneinfo/America/New_York +0 -0
- data/test/zoneinfo/Australia/Melbourne +0 -0
- data/test/zoneinfo/EST +0 -0
- data/test/zoneinfo/Etc/UTC +0 -0
- data/test/zoneinfo/Europe/Amsterdam +0 -0
- data/test/zoneinfo/Europe/Andorra +0 -0
- data/test/zoneinfo/Europe/London +0 -0
- data/test/zoneinfo/Europe/Paris +0 -0
- data/test/zoneinfo/Europe/Prague +0 -0
- data/test/zoneinfo/Factory +0 -0
- data/test/zoneinfo/iso3166.tab +0 -275
- data/test/zoneinfo/leapseconds +0 -61
- data/test/zoneinfo/posix/Europe/London +0 -0
- data/test/zoneinfo/posixrules +0 -0
- data/test/zoneinfo/right/Europe/London +0 -0
- data/test/zoneinfo/zone.tab +0 -439
- data/test/zoneinfo/zone1970.tab +0 -369
- data/tzinfo.gemspec +0 -21
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module TZInfo
|
|
5
|
+
module Format2
|
|
6
|
+
# Instances of {TimezoneDefiner} are yielded to TZInfo::Data modules by
|
|
7
|
+
# {TimezoneDefinition} to allow the offsets and transitions of the time zone
|
|
8
|
+
# to be specified.
|
|
9
|
+
#
|
|
10
|
+
# @private
|
|
11
|
+
class TimezoneDefiner #:nodoc:
|
|
12
|
+
# @return [Array<TimezoneTransition>] the defined transitions of the time
|
|
13
|
+
# zone.
|
|
14
|
+
attr_reader :transitions
|
|
15
|
+
|
|
16
|
+
# Initializes a new TimezoneDefiner.
|
|
17
|
+
#
|
|
18
|
+
# @param string_deduper [StringDeduper] a {StringDeduper} instance to use
|
|
19
|
+
# when deduping abbreviations.
|
|
20
|
+
def initialize(string_deduper)
|
|
21
|
+
@string_deduper = string_deduper
|
|
22
|
+
@offsets = {}
|
|
23
|
+
@transitions = []
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns the first offset to be defined or `nil` if no offsets have been
|
|
27
|
+
# defined. The first offset is observed before the time of the first
|
|
28
|
+
# transition.
|
|
29
|
+
#
|
|
30
|
+
# @return [TimezoneOffset] the first offset to be defined or `nil` if no
|
|
31
|
+
# offsets have been defined.
|
|
32
|
+
def first_offset
|
|
33
|
+
first = @offsets.first
|
|
34
|
+
first && first.last
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Defines an offset.
|
|
38
|
+
#
|
|
39
|
+
# @param id [Symbol] an arbitrary value used identify the offset in
|
|
40
|
+
# subsequent calls to transition. It must be unique.
|
|
41
|
+
# @param base_utc_offset [Integer] the base offset from UTC of the zone in
|
|
42
|
+
# seconds. This does not include daylight savings time.
|
|
43
|
+
# @param std_offset [Integer] the daylight savings offset from the base
|
|
44
|
+
# offset in seconds. Typically either 0 or 3600.
|
|
45
|
+
# @param abbreviation [String] an abbreviation for the offset, for
|
|
46
|
+
# example, EST or EDT.
|
|
47
|
+
# @raise [ArgumentError] if another offset has already been defined with
|
|
48
|
+
# the given id.
|
|
49
|
+
def offset(id, base_utc_offset, std_offset, abbreviation)
|
|
50
|
+
raise ArgumentError, 'An offset has already been defined with the given id' if @offsets.has_key?(id)
|
|
51
|
+
|
|
52
|
+
# Dedupe non-frozen literals from format 1 on all Ruby versions and
|
|
53
|
+
# format 2 on Ruby < 2.3 (without frozen_string_literal support).
|
|
54
|
+
abbreviation = @string_deduper.dedupe(abbreviation)
|
|
55
|
+
|
|
56
|
+
offset = TimezoneOffset.new(base_utc_offset, std_offset, abbreviation)
|
|
57
|
+
@offsets[id] = offset
|
|
58
|
+
@previous_offset ||= offset
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Defines a transition to a given offset.
|
|
62
|
+
#
|
|
63
|
+
# Transitions must be defined in increasing time order.
|
|
64
|
+
#
|
|
65
|
+
# @param offset_id [Symbol] references the id of a previously defined
|
|
66
|
+
# offset.
|
|
67
|
+
# @param timestamp_value [Integer] the time the transition occurs as a
|
|
68
|
+
# number of seconds since 1970-01-01 00:00:00 UTC ignoring leap seconds
|
|
69
|
+
# (i.e. each day is treated as if it were 86,400 seconds long).
|
|
70
|
+
# @raise [ArgumentError] if `offset_id` does not reference a defined
|
|
71
|
+
# offset.
|
|
72
|
+
# @raise [ArgumentError] if `timestamp_value` is not greater than the
|
|
73
|
+
# `timestamp_value` of the previously defined transition.
|
|
74
|
+
def transition(offset_id, timestamp_value)
|
|
75
|
+
offset = @offsets[offset_id]
|
|
76
|
+
raise ArgumentError, 'offset_id has not been defined' unless offset
|
|
77
|
+
raise ArgumentError, 'timestamp is not greater than the timestamp of the previously defined transition' if !@transitions.empty? && @transitions.last.timestamp_value >= timestamp_value
|
|
78
|
+
@transitions << TimezoneTransition.new(offset, @previous_offset, timestamp_value)
|
|
79
|
+
@previous_offset = offset
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Defines the rules that will be used for handling instants after the last
|
|
83
|
+
# transition.
|
|
84
|
+
#
|
|
85
|
+
# This method is currently just a placeholder for forward compatibility
|
|
86
|
+
# that accepts and ignores any arguments passed.
|
|
87
|
+
#
|
|
88
|
+
# Support for subsequent rules will be added in a future version of TZInfo
|
|
89
|
+
# and the rules will be included in format 2 releases of TZInfo::Data.
|
|
90
|
+
def subsequent_rules(*args)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module TZInfo
|
|
4
|
+
module Format2
|
|
5
|
+
# {Format2::TimezoneDefinition} is included into format 2 time zone
|
|
6
|
+
# definition modules and provides methods for defining time zones.
|
|
7
|
+
#
|
|
8
|
+
# @private
|
|
9
|
+
module TimezoneDefinition #:nodoc:
|
|
10
|
+
# Adds class methods to the includee.
|
|
11
|
+
#
|
|
12
|
+
# @param base [Module] the includee.
|
|
13
|
+
def self.append_features(base)
|
|
14
|
+
super
|
|
15
|
+
base.extend(ClassMethods)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Class methods for inclusion.
|
|
19
|
+
#
|
|
20
|
+
# @private
|
|
21
|
+
module ClassMethods #:nodoc:
|
|
22
|
+
# @return [TimezoneInfo] the last time zone to be defined.
|
|
23
|
+
def get
|
|
24
|
+
@timezone
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# @return [Class] the class to be instantiated and yielded by
|
|
30
|
+
# {#timezone}.
|
|
31
|
+
def timezone_definer_class
|
|
32
|
+
TimezoneDefiner
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Defines a data time zone.
|
|
36
|
+
#
|
|
37
|
+
# @param identifier [String] the identifier of the time zone.
|
|
38
|
+
# @yield [definer] yields to the caller to define the time zone.
|
|
39
|
+
# @yieldparam definer [Object] an instance of the class returned by
|
|
40
|
+
# {#timezone_definer_class}, typically {TimezoneDefiner}.
|
|
41
|
+
def timezone(identifier)
|
|
42
|
+
# Dedupe non-frozen literals from format 1 on all Ruby versions and
|
|
43
|
+
# format 2 on Ruby < 2.3 (without frozen_string_literal support).
|
|
44
|
+
string_deduper = StringDeduper.global
|
|
45
|
+
identifier = string_deduper.dedupe(identifier)
|
|
46
|
+
|
|
47
|
+
definer = timezone_definer_class.new(string_deduper)
|
|
48
|
+
yield definer
|
|
49
|
+
transitions = definer.transitions
|
|
50
|
+
|
|
51
|
+
@timezone = if transitions.empty?
|
|
52
|
+
DataSources::ConstantOffsetDataTimezoneInfo.new(identifier, definer.first_offset)
|
|
53
|
+
else
|
|
54
|
+
DataSources::TransitionsDataTimezoneInfo.new(identifier, transitions)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Defines a linked time zone.
|
|
59
|
+
#
|
|
60
|
+
# @param identifier [String] the identifier of the time zone being
|
|
61
|
+
# defined.
|
|
62
|
+
# @param link_to_identifier [String] the identifier the new time zone
|
|
63
|
+
# links to (is an alias for).
|
|
64
|
+
def linked_timezone(identifier, link_to_identifier)
|
|
65
|
+
# Dedupe non-frozen literals from format 1 on all Ruby versions and
|
|
66
|
+
# format 2 on Ruby < 2.3 (without frozen_string_literal support).
|
|
67
|
+
string_deduper = StringDeduper.global
|
|
68
|
+
@timezone = DataSources::LinkedTimezoneInfo.new(string_deduper.dedupe(identifier), string_deduper.dedupe(link_to_identifier))
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module TZInfo
|
|
4
|
+
module Format2
|
|
5
|
+
# Instances of {TimezoneIndexDefiner} are yielded by
|
|
6
|
+
# {TimezoneIndexDefinition} to allow the time zone index to be defined.
|
|
7
|
+
#
|
|
8
|
+
# @private
|
|
9
|
+
class TimezoneIndexDefiner #:nodoc:
|
|
10
|
+
# @return [Array<String>] the identifiers of all data time zones.
|
|
11
|
+
attr_reader :data_timezones
|
|
12
|
+
|
|
13
|
+
# @return [Array<String>] the identifiers of all linked time zones.
|
|
14
|
+
attr_reader :linked_timezones
|
|
15
|
+
|
|
16
|
+
# Initializes a new TimezoneDefiner.
|
|
17
|
+
#
|
|
18
|
+
# @param string_deduper [StringDeduper] a {StringDeduper} instance to use
|
|
19
|
+
# when deduping identifiers.
|
|
20
|
+
def initialize(string_deduper)
|
|
21
|
+
@string_deduper = string_deduper
|
|
22
|
+
@data_timezones = []
|
|
23
|
+
@linked_timezones = []
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Adds a data time zone to the index.
|
|
27
|
+
#
|
|
28
|
+
# @param identifier [String] the time zone identifier.
|
|
29
|
+
def data_timezone(identifier)
|
|
30
|
+
# Dedupe non-frozen literals from format 1 on all Ruby versions and
|
|
31
|
+
# format 2 on Ruby < 2.3 (without frozen_string_literal support).
|
|
32
|
+
@data_timezones << @string_deduper.dedupe(identifier)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Adds a linked time zone to the index.
|
|
36
|
+
#
|
|
37
|
+
# @param identifier [String] the time zone identifier.
|
|
38
|
+
def linked_timezone(identifier)
|
|
39
|
+
# Dedupe non-frozen literals from format 1 on all Ruby versions and
|
|
40
|
+
# format 2 on Ruby < 2.3 (without frozen_string_literal support).
|
|
41
|
+
@linked_timezones << @string_deduper.dedupe(identifier)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module TZInfo
|
|
4
|
+
module Format2
|
|
5
|
+
# The format 2 time zone index file includes {TimezoneIndexDefinition},
|
|
6
|
+
# which provides the {TimezoneIndexDefinition::ClassMethods#timezone_index
|
|
7
|
+
# timezone_index} method used to define the index.
|
|
8
|
+
#
|
|
9
|
+
# @private
|
|
10
|
+
module TimezoneIndexDefinition #:nodoc:
|
|
11
|
+
# Adds class methods to the includee and initializes class instance
|
|
12
|
+
# variables.
|
|
13
|
+
#
|
|
14
|
+
# @param base [Module] the includee.
|
|
15
|
+
def self.append_features(base)
|
|
16
|
+
super
|
|
17
|
+
base.extend(ClassMethods)
|
|
18
|
+
base.instance_eval do
|
|
19
|
+
empty = [].freeze
|
|
20
|
+
@timezones = empty
|
|
21
|
+
@data_timezones = empty
|
|
22
|
+
@linked_timezones = empty
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Class methods for inclusion.
|
|
27
|
+
#
|
|
28
|
+
# @private
|
|
29
|
+
module ClassMethods #:nodoc:
|
|
30
|
+
# @return [Array<String>] a frozen `Array` containing the identifiers of
|
|
31
|
+
# all data time zones. Identifiers are sorted according to
|
|
32
|
+
# `String#<=>`.
|
|
33
|
+
attr_reader :data_timezones
|
|
34
|
+
|
|
35
|
+
# @return [Array<String>] a frozen `Array` containing the identifiers of
|
|
36
|
+
# all linked time zones. Identifiers are sorted according to
|
|
37
|
+
# `String#<=>`.
|
|
38
|
+
attr_reader :linked_timezones
|
|
39
|
+
|
|
40
|
+
# Defines the index.
|
|
41
|
+
#
|
|
42
|
+
# @yield [definer] yields to the caller to allow the index to be
|
|
43
|
+
# defined.
|
|
44
|
+
# @yieldparam definer [TimezoneIndexDefiner] a {TimezoneIndexDefiner}
|
|
45
|
+
# instance that should be used to define the index.
|
|
46
|
+
def timezone_index
|
|
47
|
+
definer = TimezoneIndexDefiner.new(StringDeduper.global)
|
|
48
|
+
yield definer
|
|
49
|
+
@data_timezones = definer.data_timezones.sort!.freeze
|
|
50
|
+
@linked_timezones = definer.linked_timezones.sort!.freeze
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
data/lib/tzinfo/info_timezone.rb
CHANGED
|
@@ -1,30 +1,35 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
1
3
|
module TZInfo
|
|
2
4
|
|
|
3
|
-
# A Timezone based on a TimezoneInfo.
|
|
5
|
+
# A {Timezone} based on a {DataSources::TimezoneInfo}.
|
|
4
6
|
#
|
|
5
|
-
# @
|
|
6
|
-
class InfoTimezone < Timezone
|
|
7
|
-
|
|
8
|
-
#
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
# @abstract
|
|
8
|
+
class InfoTimezone < Timezone
|
|
9
|
+
# Initializes a new {InfoTimezone}.
|
|
10
|
+
#
|
|
11
|
+
# {InfoTimezone} instances should not normally be created directly. Use
|
|
12
|
+
# the {Timezone.get} method to obtain {Timezone} instances.
|
|
13
|
+
#
|
|
14
|
+
# @param info [DataSources::TimezoneInfo] a {DataSources::TimezoneInfo}
|
|
15
|
+
# instance supplied by a {DataSource} that will be used as the source of
|
|
16
|
+
# data for this {InfoTimezone}.
|
|
17
|
+
def initialize(info)
|
|
18
|
+
super()
|
|
19
|
+
@info = info
|
|
13
20
|
end
|
|
14
|
-
|
|
15
|
-
#
|
|
21
|
+
|
|
22
|
+
# (see Timezone#identifier)
|
|
16
23
|
def identifier
|
|
17
24
|
@info.identifier
|
|
18
25
|
end
|
|
19
|
-
|
|
26
|
+
|
|
20
27
|
protected
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
end
|
|
29
|
-
end
|
|
28
|
+
|
|
29
|
+
# @return [DataSources::TimezoneInfo] the {DataSources::TimezoneInfo} this
|
|
30
|
+
# {InfoTimezone} is based on.
|
|
31
|
+
def info
|
|
32
|
+
@info
|
|
33
|
+
end
|
|
34
|
+
end
|
|
30
35
|
end
|
|
@@ -1,63 +1,44 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
1
3
|
module TZInfo
|
|
4
|
+
# Represents time zones that are defined as a link to or alias for another
|
|
5
|
+
# time zone.
|
|
6
|
+
class LinkedTimezone < InfoTimezone
|
|
7
|
+
# Initializes a new {LinkedTimezone}.
|
|
8
|
+
#
|
|
9
|
+
# {LinkedTimezone} instances should not normally be created directly. Use
|
|
10
|
+
# the {Timezone.get} method to obtain {Timezone} instances.
|
|
11
|
+
#
|
|
12
|
+
# @param info [DataSources::LinkedTimezoneInfo] a
|
|
13
|
+
# {DataSources::LinkedTimezoneInfo} instance supplied by a {DataSource}
|
|
14
|
+
# that will be used as the source of data for this {LinkedTimezone}.
|
|
15
|
+
def initialize(info)
|
|
16
|
+
super
|
|
17
|
+
@linked_timezone = Timezone.get(info.link_to_identifier)
|
|
18
|
+
end
|
|
2
19
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class LinkedTimezone < InfoTimezone #:nodoc:
|
|
7
|
-
# Returns the TimezonePeriod for the given UTC time. utc can either be
|
|
8
|
-
# a DateTime, Time or integer timestamp (Time.to_i). Any timezone
|
|
9
|
-
# information in utc is ignored (it is treated as a UTC time).
|
|
10
|
-
#
|
|
11
|
-
# If no TimezonePeriod could be found, PeriodNotFound is raised.
|
|
12
|
-
def period_for_utc(utc)
|
|
13
|
-
@linked_timezone.period_for_utc(utc)
|
|
20
|
+
# (see Timezone#period_for)
|
|
21
|
+
def period_for(time)
|
|
22
|
+
@linked_timezone.period_for(time)
|
|
14
23
|
end
|
|
15
|
-
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# Raises PeriodNotFound if no periods are found for the given time.
|
|
20
|
-
def periods_for_local(local)
|
|
21
|
-
@linked_timezone.periods_for_local(local)
|
|
24
|
+
|
|
25
|
+
# (see Timezone#periods_for_local)
|
|
26
|
+
def periods_for_local(local_time)
|
|
27
|
+
@linked_timezone.periods_for_local(local_time)
|
|
22
28
|
end
|
|
23
|
-
|
|
24
|
-
#
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# Transitions are returned up to a given date and time up to a given date
|
|
28
|
-
# and time, specified in UTC (utc_to).
|
|
29
|
-
#
|
|
30
|
-
# A from date and time may also be supplied using the utc_from parameter
|
|
31
|
-
# (also specified in UTC). If utc_from is not nil, only transitions from
|
|
32
|
-
# that date and time onwards will be returned.
|
|
33
|
-
#
|
|
34
|
-
# Comparisons with utc_to are exclusive. Comparisons with utc_from are
|
|
35
|
-
# inclusive. If a transition falls precisely on utc_to, it will be excluded.
|
|
36
|
-
# If a transition falls on utc_from, it will be included.
|
|
37
|
-
#
|
|
38
|
-
# Transitions returned are ordered by when they occur, from earliest to
|
|
39
|
-
# latest.
|
|
40
|
-
#
|
|
41
|
-
# utc_to and utc_from can be specified using either DateTime, Time or
|
|
42
|
-
# integer timestamps (Time.to_i).
|
|
43
|
-
#
|
|
44
|
-
# If utc_from is specified and utc_to is not greater than utc_from, then
|
|
45
|
-
# transitions_up_to raises an ArgumentError exception.
|
|
46
|
-
def transitions_up_to(utc_to, utc_from = nil)
|
|
47
|
-
@linked_timezone.transitions_up_to(utc_to, utc_from)
|
|
29
|
+
|
|
30
|
+
# (see Timezone#transitions_up_to)
|
|
31
|
+
def transitions_up_to(to, from = nil)
|
|
32
|
+
@linked_timezone.transitions_up_to(to, from)
|
|
48
33
|
end
|
|
49
|
-
|
|
50
|
-
# Returns the canonical
|
|
34
|
+
|
|
35
|
+
# Returns the canonical {Timezone} instance for this {LinkedTimezone}.
|
|
36
|
+
#
|
|
37
|
+
# For a {LinkedTimezone}, this is the canonical zone of the link target.
|
|
51
38
|
#
|
|
52
|
-
#
|
|
39
|
+
# @return [Timezone] the canonical {Timezone} instance for this {Timezone}.
|
|
53
40
|
def canonical_zone
|
|
54
41
|
@linked_timezone.canonical_zone
|
|
55
42
|
end
|
|
56
|
-
|
|
57
|
-
protected
|
|
58
|
-
def setup(info)
|
|
59
|
-
super(info)
|
|
60
|
-
@linked_timezone = Timezone.get(info.link_to_identifier)
|
|
61
|
-
end
|
|
62
43
|
end
|
|
63
44
|
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module TZInfo
|
|
4
|
+
# Represents the infinite period of time in a time zone that constantly
|
|
5
|
+
# observes the same offset from UTC (has an unbounded start and end).
|
|
6
|
+
class OffsetTimezonePeriod < TimezonePeriod
|
|
7
|
+
# Initializes an {OffsetTimezonePeriod}.
|
|
8
|
+
#
|
|
9
|
+
# @param offset [TimezoneOffset] the offset that is constantly observed.
|
|
10
|
+
# @raise [ArgumentError] if `offset` is `nil`.
|
|
11
|
+
def initialize(offset)
|
|
12
|
+
super
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @return [TimezoneTransition] the transition that defines the start of this
|
|
16
|
+
# {TimezonePeriod}, always `nil` for {OffsetTimezonePeriod}.
|
|
17
|
+
def start_transition
|
|
18
|
+
nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @return [TimezoneTransition] the transition that defines the end of this
|
|
22
|
+
# {TimezonePeriod}, always `nil` for {OffsetTimezonePeriod}.
|
|
23
|
+
def end_transition
|
|
24
|
+
nil
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Determines if this {OffsetTimezonePeriod} is equal to another instance.
|
|
28
|
+
#
|
|
29
|
+
# @param p [Object] the instance to test for equality.
|
|
30
|
+
# @return [Boolean] `true` if `p` is a {OffsetTimezonePeriod} with the same
|
|
31
|
+
# {offset}, otherwise `false`.
|
|
32
|
+
def ==(p)
|
|
33
|
+
p.kind_of?(OffsetTimezonePeriod) && offset == p.offset
|
|
34
|
+
end
|
|
35
|
+
alias eql? ==
|
|
36
|
+
|
|
37
|
+
# @return [Integer] a hash based on {offset}.
|
|
38
|
+
def hash
|
|
39
|
+
offset.hash
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|