tzinfo 1.2.11 → 2.0.0
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/.yardopts +3 -0
- data/CHANGES.md +469 -431
- data/LICENSE +13 -13
- data/README.md +368 -114
- data/lib/tzinfo/country.rb +131 -129
- data/lib/tzinfo/country_timezone.rb +70 -112
- data/lib/tzinfo/data_source.rb +389 -144
- 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 +141 -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 +573 -0
- data/lib/tzinfo/data_sources/zoneinfo_reader.rb +284 -0
- data/lib/tzinfo/data_sources.rb +8 -0
- data/lib/tzinfo/data_timezone.rb +33 -47
- data/lib/tzinfo/datetime_with_offset.rb +153 -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/format1.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/format2.rb +10 -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 +979 -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/version.rb +7 -0
- data/lib/tzinfo/with_offset.rb +61 -0
- data/lib/tzinfo.rb +60 -40
- data.tar.gz.sig +0 -0
- metadata +51 -115
- metadata.gz.sig +2 -3
- data/Rakefile +0 -107
- data/lib/tzinfo/annual_rules.rb +0 -51
- 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/posix_time_zone_parser.rb +0 -136
- data/lib/tzinfo/ruby_core_support.rb +0 -176
- data/lib/tzinfo/ruby_country_info.rb +0 -74
- data/lib/tzinfo/ruby_data_source.rb +0 -136
- data/lib/tzinfo/time_or_datetime.rb +0 -351
- 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/transition_rule.rb +0 -325
- data/lib/tzinfo/zoneinfo_country_info.rb +0 -37
- data/lib/tzinfo/zoneinfo_data_source.rb +0 -504
- data/lib/tzinfo/zoneinfo_timezone_info.rb +0 -516
- data/test/assets/payload.rb +0 -1
- data/test/tc_annual_rules.rb +0 -95
- data/test/tc_country.rb +0 -240
- 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_posix_time_zone_parser.rb +0 -261
- 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 -175
- data/test/tc_time_or_datetime.rb +0 -674
- 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_transition_rule.rb +0 -663
- data/test/tc_zoneinfo_country_info.rb +0 -78
- data/test/tc_zoneinfo_data_source.rb +0 -1226
- data/test/tc_zoneinfo_timezone_info.rb +0 -2149
- data/test/test_utils.rb +0 -214
- 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/definitions/America/Argentina/Buenos_Aires.rb +0 -89
- data/test/tzinfo-data/tzinfo/data/definitions/America/New_York.rb +0 -327
- data/test/tzinfo-data/tzinfo/data/definitions/Australia/Melbourne.rb +0 -230
- 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 -273
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/Andorra.rb +0 -198
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/London.rb +0 -333
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/Paris.rb +0 -277
- data/test/tzinfo-data/tzinfo/data/definitions/Europe/Prague.rb +0 -235
- data/test/tzinfo-data/tzinfo/data/definitions/UTC.rb +0 -16
- data/test/tzinfo-data/tzinfo/data/indexes/countries.rb +0 -940
- data/test/tzinfo-data/tzinfo/data/indexes/timezones.rb +0 -609
- data/test/tzinfo-data/tzinfo/data/version.rb +0 -20
- data/test/tzinfo-data/tzinfo/data.rb +0 -8
- 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 -274
- data/test/zoneinfo/leapseconds +0 -78
- 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 -452
- data/test/zoneinfo/zone1970.tab +0 -384
- data/tzinfo.gemspec +0 -21
|
@@ -1,351 +0,0 @@
|
|
|
1
|
-
require 'date'
|
|
2
|
-
require 'rational' unless defined?(Rational)
|
|
3
|
-
require 'time'
|
|
4
|
-
|
|
5
|
-
module TZInfo
|
|
6
|
-
# Used by TZInfo internally to represent either a Time, DateTime or
|
|
7
|
-
# an Integer timestamp (seconds since 1970-01-01 00:00:00).
|
|
8
|
-
class TimeOrDateTime
|
|
9
|
-
include Comparable
|
|
10
|
-
|
|
11
|
-
# Constructs a new TimeOrDateTime. timeOrDateTime can be a Time, DateTime
|
|
12
|
-
# or Integer. If using a Time or DateTime, any time zone information
|
|
13
|
-
# is ignored.
|
|
14
|
-
#
|
|
15
|
-
# Integer timestamps must be within the range supported by Time on the
|
|
16
|
-
# platform being used.
|
|
17
|
-
def initialize(timeOrDateTime)
|
|
18
|
-
@time = nil
|
|
19
|
-
@datetime = nil
|
|
20
|
-
@timestamp = nil
|
|
21
|
-
|
|
22
|
-
if timeOrDateTime.is_a?(Time)
|
|
23
|
-
@time = timeOrDateTime
|
|
24
|
-
|
|
25
|
-
# Avoid using the slower Rational class unless necessary.
|
|
26
|
-
nsec = RubyCoreSupport.time_nsec(@time)
|
|
27
|
-
usec = nsec % 1000 == 0 ? nsec / 1000 : Rational(nsec, 1000)
|
|
28
|
-
|
|
29
|
-
@time = Time.utc(@time.year, @time.mon, @time.mday, @time.hour, @time.min, @time.sec, usec) unless @time.utc?
|
|
30
|
-
@orig = @time
|
|
31
|
-
elsif timeOrDateTime.is_a?(DateTime)
|
|
32
|
-
@datetime = timeOrDateTime
|
|
33
|
-
@datetime = @datetime.new_offset(0) unless @datetime.offset == 0
|
|
34
|
-
@orig = @datetime
|
|
35
|
-
else
|
|
36
|
-
@timestamp = timeOrDateTime.to_i
|
|
37
|
-
|
|
38
|
-
if !RubyCoreSupport.time_supports_64bit && (@timestamp > 2147483647 || @timestamp < -2147483648 || (@timestamp < 0 && !RubyCoreSupport.time_supports_negative))
|
|
39
|
-
raise RangeError, 'Timestamp is outside the supported range of Time on this platform'
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
@orig = @timestamp
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Returns the time as a Time.
|
|
47
|
-
#
|
|
48
|
-
# When converting from a DateTime, the result is truncated to microsecond
|
|
49
|
-
# precision.
|
|
50
|
-
def to_time
|
|
51
|
-
# Thread-safety: It is possible that the value of @time may be
|
|
52
|
-
# calculated multiple times in concurrently executing threads. It is not
|
|
53
|
-
# worth the overhead of locking to ensure that @time is only
|
|
54
|
-
# calculated once.
|
|
55
|
-
|
|
56
|
-
unless @time
|
|
57
|
-
result = if @timestamp
|
|
58
|
-
Time.at(@timestamp).utc
|
|
59
|
-
else
|
|
60
|
-
Time.utc(year, mon, mday, hour, min, sec, usec)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
return result if frozen?
|
|
64
|
-
@time = result
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
@time
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# Returns the time as a DateTime.
|
|
71
|
-
#
|
|
72
|
-
# When converting from a Time, the result is truncated to microsecond
|
|
73
|
-
# precision.
|
|
74
|
-
def to_datetime
|
|
75
|
-
# Thread-safety: It is possible that the value of @datetime may be
|
|
76
|
-
# calculated multiple times in concurrently executing threads. It is not
|
|
77
|
-
# worth the overhead of locking to ensure that @datetime is only
|
|
78
|
-
# calculated once.
|
|
79
|
-
|
|
80
|
-
unless @datetime
|
|
81
|
-
# Avoid using Rational unless necessary.
|
|
82
|
-
u = usec
|
|
83
|
-
s = u == 0 ? sec : Rational(sec * 1000000 + u, 1000000)
|
|
84
|
-
result = RubyCoreSupport.datetime_new(year, mon, mday, hour, min, s)
|
|
85
|
-
return result if frozen?
|
|
86
|
-
@datetime = result
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
@datetime
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
# Returns the time as an integer timestamp.
|
|
93
|
-
def to_i
|
|
94
|
-
# Thread-safety: It is possible that the value of @timestamp may be
|
|
95
|
-
# calculated multiple times in concurrently executing threads. It is not
|
|
96
|
-
# worth the overhead of locking to ensure that @timestamp is only
|
|
97
|
-
# calculated once.
|
|
98
|
-
|
|
99
|
-
unless @timestamp
|
|
100
|
-
result = to_time.to_i
|
|
101
|
-
return result if frozen?
|
|
102
|
-
@timestamp = result
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
@timestamp
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# Returns the time as the original time passed to new.
|
|
109
|
-
def to_orig
|
|
110
|
-
@orig
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# Returns a string representation of the TimeOrDateTime.
|
|
114
|
-
def to_s
|
|
115
|
-
if @orig.is_a?(Time)
|
|
116
|
-
"Time: #{@orig.to_s}"
|
|
117
|
-
elsif @orig.is_a?(DateTime)
|
|
118
|
-
"DateTime: #{@orig.to_s}"
|
|
119
|
-
else
|
|
120
|
-
"Timestamp: #{@orig.to_s}"
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# Returns internal object state as a programmer-readable string.
|
|
125
|
-
def inspect
|
|
126
|
-
"#<#{self.class}: #{@orig.inspect}>"
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
# Returns the year.
|
|
130
|
-
def year
|
|
131
|
-
if @time
|
|
132
|
-
@time.year
|
|
133
|
-
elsif @datetime
|
|
134
|
-
@datetime.year
|
|
135
|
-
else
|
|
136
|
-
to_time.year
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# Returns the month of the year (1..12).
|
|
141
|
-
def mon
|
|
142
|
-
if @time
|
|
143
|
-
@time.mon
|
|
144
|
-
elsif @datetime
|
|
145
|
-
@datetime.mon
|
|
146
|
-
else
|
|
147
|
-
to_time.mon
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
alias :month :mon
|
|
151
|
-
|
|
152
|
-
# Returns the day of the month (1..n).
|
|
153
|
-
def mday
|
|
154
|
-
if @time
|
|
155
|
-
@time.mday
|
|
156
|
-
elsif @datetime
|
|
157
|
-
@datetime.mday
|
|
158
|
-
else
|
|
159
|
-
to_time.mday
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
alias :day :mday
|
|
163
|
-
|
|
164
|
-
# Returns the day of the week (0..6 for Sunday to Saturday).
|
|
165
|
-
def wday
|
|
166
|
-
if @time
|
|
167
|
-
@time.wday
|
|
168
|
-
elsif @datetime
|
|
169
|
-
@datetime.wday
|
|
170
|
-
else
|
|
171
|
-
to_time.wday
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
# Returns the hour of the day (0..23).
|
|
176
|
-
def hour
|
|
177
|
-
if @time
|
|
178
|
-
@time.hour
|
|
179
|
-
elsif @datetime
|
|
180
|
-
@datetime.hour
|
|
181
|
-
else
|
|
182
|
-
to_time.hour
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
# Returns the minute of the hour (0..59).
|
|
187
|
-
def min
|
|
188
|
-
if @time
|
|
189
|
-
@time.min
|
|
190
|
-
elsif @datetime
|
|
191
|
-
@datetime.min
|
|
192
|
-
else
|
|
193
|
-
to_time.min
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
# Returns the second of the minute (0..60). (60 for a leap second).
|
|
198
|
-
def sec
|
|
199
|
-
if @time
|
|
200
|
-
@time.sec
|
|
201
|
-
elsif @datetime
|
|
202
|
-
@datetime.sec
|
|
203
|
-
else
|
|
204
|
-
to_time.sec
|
|
205
|
-
end
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
# Returns the number of microseconds for the time.
|
|
209
|
-
def usec
|
|
210
|
-
if @time
|
|
211
|
-
@time.usec
|
|
212
|
-
elsif @datetime
|
|
213
|
-
# Ruby 1.8 has sec_fraction (of which the documentation says
|
|
214
|
-
# 'I do NOT recommend you to use this method'). sec_fraction no longer
|
|
215
|
-
# exists in Ruby 1.9.
|
|
216
|
-
|
|
217
|
-
# Calculate the sec_fraction from the day_fraction.
|
|
218
|
-
((@datetime.day_fraction - OffsetRationals.rational_for_offset(@datetime.hour * 3600 + @datetime.min * 60 + @datetime.sec)) * 86400000000).to_i
|
|
219
|
-
else
|
|
220
|
-
0
|
|
221
|
-
end
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
# Compares this TimeOrDateTime with another Time, DateTime, timestamp
|
|
225
|
-
# (Integer) or TimeOrDateTime. Returns -1, 0 or +1 depending
|
|
226
|
-
# whether the receiver is less than, equal to, or greater than
|
|
227
|
-
# timeOrDateTime.
|
|
228
|
-
#
|
|
229
|
-
# Returns nil if the passed in timeOrDateTime is not comparable with
|
|
230
|
-
# TimeOrDateTime instances.
|
|
231
|
-
#
|
|
232
|
-
# Comparisons involving a DateTime will be performed using DateTime#<=>.
|
|
233
|
-
# Comparisons that don't involve a DateTime, but include a Time will be
|
|
234
|
-
# performed with Time#<=>. Otherwise comparisons will be performed with
|
|
235
|
-
# Integer#<=>.
|
|
236
|
-
def <=>(timeOrDateTime)
|
|
237
|
-
return nil unless timeOrDateTime.is_a?(TimeOrDateTime) ||
|
|
238
|
-
timeOrDateTime.is_a?(Time) ||
|
|
239
|
-
timeOrDateTime.is_a?(DateTime) ||
|
|
240
|
-
timeOrDateTime.respond_to?(:to_i)
|
|
241
|
-
|
|
242
|
-
unless timeOrDateTime.is_a?(TimeOrDateTime)
|
|
243
|
-
timeOrDateTime = TimeOrDateTime.wrap(timeOrDateTime)
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
orig = timeOrDateTime.to_orig
|
|
247
|
-
|
|
248
|
-
if @orig.is_a?(DateTime) || orig.is_a?(DateTime)
|
|
249
|
-
# If either is a DateTime, assume it is there for a reason
|
|
250
|
-
# (i.e. for its larger range of acceptable values on 32-bit systems).
|
|
251
|
-
to_datetime <=> timeOrDateTime.to_datetime
|
|
252
|
-
elsif @orig.is_a?(Time) || orig.is_a?(Time)
|
|
253
|
-
to_time <=> timeOrDateTime.to_time
|
|
254
|
-
else
|
|
255
|
-
to_i <=> timeOrDateTime.to_i
|
|
256
|
-
end
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
# Adds a number of seconds to the TimeOrDateTime. Returns a new
|
|
260
|
-
# TimeOrDateTime, preserving what the original constructed type was.
|
|
261
|
-
# If the original type is a Time and the resulting calculation goes out of
|
|
262
|
-
# range for Times, then an exception will be raised by the Time class.
|
|
263
|
-
def +(seconds)
|
|
264
|
-
if seconds == 0
|
|
265
|
-
self
|
|
266
|
-
else
|
|
267
|
-
if @orig.is_a?(DateTime)
|
|
268
|
-
TimeOrDateTime.new(@orig + OffsetRationals.rational_for_offset(seconds))
|
|
269
|
-
else
|
|
270
|
-
# + defined for Time and Integer
|
|
271
|
-
TimeOrDateTime.new(@orig + seconds)
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
# Subtracts a number of seconds from the TimeOrDateTime. Returns a new
|
|
277
|
-
# TimeOrDateTime, preserving what the original constructed type was.
|
|
278
|
-
# If the original type is a Time and the resulting calculation goes out of
|
|
279
|
-
# range for Times, then an exception will be raised by the Time class.
|
|
280
|
-
def -(seconds)
|
|
281
|
-
self + (-seconds)
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
# Similar to the + operator, but converts to a DateTime based TimeOrDateTime
|
|
285
|
-
# where the Time or Integer timestamp to go out of the allowed range for a
|
|
286
|
-
# Time, converts to a DateTime based TimeOrDateTime.
|
|
287
|
-
#
|
|
288
|
-
# Note that the range of Time varies based on the platform.
|
|
289
|
-
def add_with_convert(seconds)
|
|
290
|
-
if seconds == 0
|
|
291
|
-
self
|
|
292
|
-
else
|
|
293
|
-
if @orig.is_a?(DateTime)
|
|
294
|
-
TimeOrDateTime.new(@orig + OffsetRationals.rational_for_offset(seconds))
|
|
295
|
-
else
|
|
296
|
-
# A Time or timestamp.
|
|
297
|
-
result = to_i + seconds
|
|
298
|
-
|
|
299
|
-
if ((result > 2147483647 || result < -2147483648) && !RubyCoreSupport.time_supports_64bit) || (result < 0 && !RubyCoreSupport.time_supports_negative)
|
|
300
|
-
result = TimeOrDateTime.new(to_datetime + OffsetRationals.rational_for_offset(seconds))
|
|
301
|
-
else
|
|
302
|
-
result = TimeOrDateTime.new(@orig + seconds)
|
|
303
|
-
end
|
|
304
|
-
end
|
|
305
|
-
end
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
# Returns true if todt represents the same time and was originally
|
|
309
|
-
# constructed with the same type (DateTime, Time or timestamp) as this
|
|
310
|
-
# TimeOrDateTime.
|
|
311
|
-
def eql?(todt)
|
|
312
|
-
todt.kind_of?(TimeOrDateTime) && to_orig.eql?(todt.to_orig)
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
# Returns a hash of this TimeOrDateTime.
|
|
316
|
-
def hash
|
|
317
|
-
@orig.hash
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
# If no block is given, returns a TimeOrDateTime wrapping the given
|
|
321
|
-
# timeOrDateTime. If a block is specified, a TimeOrDateTime is constructed
|
|
322
|
-
# and passed to the block. The result of the block must be a TimeOrDateTime.
|
|
323
|
-
#
|
|
324
|
-
# The result of the block will be converted to the type of the originally
|
|
325
|
-
# passed in timeOrDateTime and then returned as the result of wrap.
|
|
326
|
-
#
|
|
327
|
-
# timeOrDateTime can be a Time, DateTime, timestamp (Integer) or
|
|
328
|
-
# TimeOrDateTime. If a TimeOrDateTime is passed in, no new TimeOrDateTime
|
|
329
|
-
# will be constructed and the value passed to wrap will be used when
|
|
330
|
-
# calling the block.
|
|
331
|
-
def self.wrap(timeOrDateTime)
|
|
332
|
-
t = timeOrDateTime.is_a?(TimeOrDateTime) ? timeOrDateTime : TimeOrDateTime.new(timeOrDateTime)
|
|
333
|
-
|
|
334
|
-
if block_given?
|
|
335
|
-
t = yield t
|
|
336
|
-
|
|
337
|
-
if timeOrDateTime.is_a?(TimeOrDateTime)
|
|
338
|
-
t
|
|
339
|
-
elsif timeOrDateTime.is_a?(Time)
|
|
340
|
-
t.to_time
|
|
341
|
-
elsif timeOrDateTime.is_a?(DateTime)
|
|
342
|
-
t.to_datetime
|
|
343
|
-
else
|
|
344
|
-
t.to_i
|
|
345
|
-
end
|
|
346
|
-
else
|
|
347
|
-
t
|
|
348
|
-
end
|
|
349
|
-
end
|
|
350
|
-
end
|
|
351
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
module TZInfo
|
|
2
|
-
|
|
3
|
-
# TimezoneDefinition is included into Timezone definition modules.
|
|
4
|
-
# TimezoneDefinition provides the methods for defining timezones.
|
|
5
|
-
#
|
|
6
|
-
# @private
|
|
7
|
-
module TimezoneDefinition #:nodoc:
|
|
8
|
-
# Add class methods to the includee.
|
|
9
|
-
def self.append_features(base)
|
|
10
|
-
super
|
|
11
|
-
base.extend(ClassMethods)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Class methods for inclusion.
|
|
15
|
-
#
|
|
16
|
-
# @private
|
|
17
|
-
module ClassMethods #:nodoc:
|
|
18
|
-
# Returns and yields a TransitionDataTimezoneInfo object to define a
|
|
19
|
-
# timezone.
|
|
20
|
-
def timezone(identifier)
|
|
21
|
-
yield @timezone = TransitionDataTimezoneInfo.new(identifier)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Defines a linked timezone.
|
|
25
|
-
def linked_timezone(identifier, link_to_identifier)
|
|
26
|
-
@timezone = LinkedTimezoneInfo.new(identifier, link_to_identifier)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Returns the last TimezoneInfo to be defined with timezone or
|
|
30
|
-
# linked_timezone.
|
|
31
|
-
def get
|
|
32
|
-
@timezone
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
module TZInfo
|
|
2
|
-
# The timezone index file includes TimezoneIndexDefinition which provides
|
|
3
|
-
# methods used to define timezones in the index.
|
|
4
|
-
#
|
|
5
|
-
# @private
|
|
6
|
-
module TimezoneIndexDefinition #:nodoc:
|
|
7
|
-
# Add class methods to the includee and initialize class instance variables.
|
|
8
|
-
def self.append_features(base)
|
|
9
|
-
super
|
|
10
|
-
base.extend(ClassMethods)
|
|
11
|
-
base.instance_eval do
|
|
12
|
-
@timezones = []
|
|
13
|
-
@data_timezones = []
|
|
14
|
-
@linked_timezones = []
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Class methods for inclusion.
|
|
19
|
-
#
|
|
20
|
-
# @private
|
|
21
|
-
module ClassMethods #:nodoc:
|
|
22
|
-
# Defines a timezone based on data.
|
|
23
|
-
def timezone(identifier)
|
|
24
|
-
@timezones << identifier
|
|
25
|
-
@data_timezones << identifier
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Defines a timezone which is a link to another timezone.
|
|
29
|
-
def linked_timezone(identifier)
|
|
30
|
-
@timezones << identifier
|
|
31
|
-
@linked_timezones << identifier
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Returns a frozen array containing the identifiers of all the timezones.
|
|
35
|
-
# Identifiers appear in the order they were defined in the index.
|
|
36
|
-
def timezones
|
|
37
|
-
@timezones.freeze
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Returns a frozen array containing the identifiers of all data timezones.
|
|
41
|
-
# Identifiers appear in the order they were defined in the index.
|
|
42
|
-
def data_timezones
|
|
43
|
-
@data_timezones.freeze
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Returns a frozen array containing the identifiers of all linked
|
|
47
|
-
# timezones. Identifiers appear in the order they were defined in
|
|
48
|
-
# the index.
|
|
49
|
-
def linked_timezones
|
|
50
|
-
@linked_timezones.freeze
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
data/lib/tzinfo/timezone_info.rb
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
module TZInfo
|
|
2
|
-
# Represents a timezone defined by a data source.
|
|
3
|
-
class TimezoneInfo
|
|
4
|
-
|
|
5
|
-
# The timezone identifier.
|
|
6
|
-
attr_reader :identifier
|
|
7
|
-
|
|
8
|
-
# Constructs a new TimezoneInfo with an identifier.
|
|
9
|
-
def initialize(identifier)
|
|
10
|
-
@identifier = identifier
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
# Returns internal object state as a programmer-readable string.
|
|
14
|
-
def inspect
|
|
15
|
-
"#<#{self.class}: #@identifier>"
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Constructs a Timezone instance for the timezone represented by this
|
|
19
|
-
# TimezoneInfo.
|
|
20
|
-
def create_timezone
|
|
21
|
-
raise_not_implemented('create_timezone')
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def raise_not_implemented(method_name)
|
|
27
|
-
raise NotImplementedError, "Subclasses must override #{method_name}"
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
module TZInfo
|
|
2
|
-
# A TimezoneTransition defined by as integer timestamp, as a rational to
|
|
3
|
-
# create a DateTime or as both.
|
|
4
|
-
#
|
|
5
|
-
# @private
|
|
6
|
-
class TimezoneTransitionDefinition < TimezoneTransition #:nodoc:
|
|
7
|
-
# The numerator of the DateTime if the transition time is defined as a
|
|
8
|
-
# DateTime, otherwise the transition time as a timestamp.
|
|
9
|
-
attr_reader :numerator_or_time
|
|
10
|
-
protected :numerator_or_time
|
|
11
|
-
|
|
12
|
-
# Either the denominator of the DateTime if the transition time is defined
|
|
13
|
-
# as a DateTime, otherwise nil.
|
|
14
|
-
attr_reader :denominator
|
|
15
|
-
protected :denominator
|
|
16
|
-
|
|
17
|
-
# Creates a new TimezoneTransitionDefinition with the given offset,
|
|
18
|
-
# previous_offset (both TimezoneOffset instances) and UTC time.
|
|
19
|
-
#
|
|
20
|
-
# The time can be specified as a timestamp, as a rational to create a
|
|
21
|
-
# DateTime, or as both.
|
|
22
|
-
#
|
|
23
|
-
# If both a timestamp and rational are given, then the rational will only
|
|
24
|
-
# be used if the timestamp falls outside of the range of Time on the
|
|
25
|
-
# platform being used at runtime.
|
|
26
|
-
#
|
|
27
|
-
# DateTimes are created from the rational as follows:
|
|
28
|
-
#
|
|
29
|
-
# RubyCoreSupport.datetime_new!(RubyCoreSupport.rational_new!(numerator, denominator), 0, Date::ITALY)
|
|
30
|
-
#
|
|
31
|
-
# For performance reasons, the numerator and denominator must be specified
|
|
32
|
-
# in their lowest form.
|
|
33
|
-
def initialize(offset, previous_offset, numerator_or_timestamp, denominator_or_numerator = nil, denominator = nil)
|
|
34
|
-
super(offset, previous_offset)
|
|
35
|
-
|
|
36
|
-
if denominator
|
|
37
|
-
numerator = denominator_or_numerator
|
|
38
|
-
timestamp = numerator_or_timestamp
|
|
39
|
-
elsif denominator_or_numerator
|
|
40
|
-
numerator = numerator_or_timestamp
|
|
41
|
-
denominator = denominator_or_numerator
|
|
42
|
-
timestamp = nil
|
|
43
|
-
else
|
|
44
|
-
numerator = nil
|
|
45
|
-
denominator = nil
|
|
46
|
-
timestamp = numerator_or_timestamp
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# Determine whether to use the timestamp or the numerator and denominator.
|
|
50
|
-
if numerator && (
|
|
51
|
-
!timestamp ||
|
|
52
|
-
(timestamp < 0 && !RubyCoreSupport.time_supports_negative) ||
|
|
53
|
-
((timestamp < -2147483648 || timestamp > 2147483647) && !RubyCoreSupport.time_supports_64bit)
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
@numerator_or_time = numerator
|
|
57
|
-
@denominator = denominator
|
|
58
|
-
else
|
|
59
|
-
@numerator_or_time = timestamp
|
|
60
|
-
@denominator = nil
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
@at = nil
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# A TimeOrDateTime instance representing the UTC time when this transition
|
|
67
|
-
# occurs.
|
|
68
|
-
def at
|
|
69
|
-
# Thread-safety: It is possible that the value of @at may be calculated
|
|
70
|
-
# multiple times in concurrently executing threads. It is not worth the
|
|
71
|
-
# overhead of locking to ensure that @at is only calculated once.
|
|
72
|
-
|
|
73
|
-
unless @at
|
|
74
|
-
result = unless @denominator
|
|
75
|
-
TimeOrDateTime.new(@numerator_or_time)
|
|
76
|
-
else
|
|
77
|
-
r = RubyCoreSupport.rational_new!(@numerator_or_time, @denominator)
|
|
78
|
-
dt = RubyCoreSupport.datetime_new!(r, 0, Date::ITALY)
|
|
79
|
-
TimeOrDateTime.new(dt)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
return result if frozen?
|
|
83
|
-
@at = result
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
@at
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# Returns true if this TimezoneTransitionDefinition is equal to the given
|
|
90
|
-
# TimezoneTransitionDefinition. Two TimezoneTransitionDefinition instances
|
|
91
|
-
# are considered to be equal by eql? if offset, previous_offset,
|
|
92
|
-
# numerator_or_time and denominator are all equal.
|
|
93
|
-
def eql?(tti)
|
|
94
|
-
tti.kind_of?(TimezoneTransitionDefinition) &&
|
|
95
|
-
offset == tti.offset && previous_offset == tti.previous_offset &&
|
|
96
|
-
numerator_or_time == tti.numerator_or_time && denominator == tti.denominator
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# Returns a hash of this TimezoneTransitionDefinition instance.
|
|
100
|
-
def hash
|
|
101
|
-
@offset.hash ^ @previous_offset.hash ^ @numerator_or_time.hash ^ @denominator.hash
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|