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
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
module TZInfo
|
|
2
|
-
# Represents a defined timezone containing transition data.
|
|
3
|
-
class DataTimezoneInfo < TimezoneInfo
|
|
4
|
-
|
|
5
|
-
# Returns the TimezonePeriod for the given UTC time.
|
|
6
|
-
def period_for_utc(utc)
|
|
7
|
-
raise_not_implemented('period_for_utc')
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# Returns the set of TimezonePeriods for the given local time as an array.
|
|
11
|
-
# Results returned are ordered by increasing UTC start date.
|
|
12
|
-
# Returns an empty array if no periods are found for the given time.
|
|
13
|
-
def periods_for_local(local)
|
|
14
|
-
raise_not_implemented('periods_for_local')
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# Returns an Array of TimezoneTransition instances representing the times
|
|
18
|
-
# where the UTC offset of the timezone changes.
|
|
19
|
-
#
|
|
20
|
-
# Transitions are returned up to a given date and time up to a given date
|
|
21
|
-
# and time, specified in UTC (utc_to).
|
|
22
|
-
#
|
|
23
|
-
# A from date and time may also be supplied using the utc_from parameter
|
|
24
|
-
# (also specified in UTC). If utc_from is not nil, only transitions from
|
|
25
|
-
# that date and time onwards will be returned.
|
|
26
|
-
#
|
|
27
|
-
# Comparisons with utc_to are exclusive. Comparisons with utc_from are
|
|
28
|
-
# inclusive. If a transition falls precisely on utc_to, it will be excluded.
|
|
29
|
-
# If a transition falls on utc_from, it will be included.
|
|
30
|
-
#
|
|
31
|
-
# Transitions returned are ordered by when they occur, from earliest to
|
|
32
|
-
# latest.
|
|
33
|
-
#
|
|
34
|
-
# utc_to and utc_from can be specified using either DateTime, Time or
|
|
35
|
-
# integer timestamps (Time.to_i).
|
|
36
|
-
#
|
|
37
|
-
# If utc_from is specified and utc_to is not greater than utc_from, then
|
|
38
|
-
# transitions_up_to raises an ArgumentError exception.
|
|
39
|
-
def transitions_up_to(utc_to, utc_from = nil)
|
|
40
|
-
raise_not_implemented('transitions_up_to')
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Constructs a Timezone instance for the timezone represented by this
|
|
44
|
-
# DataTimezoneInfo.
|
|
45
|
-
def create_timezone
|
|
46
|
-
DataTimezone.new(self)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
private
|
|
50
|
-
|
|
51
|
-
def raise_not_implemented(method_name)
|
|
52
|
-
raise NotImplementedError, "Subclasses must override #{method_name}"
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
module TZInfo
|
|
2
|
-
# Represents a timezone that is defined as a link or alias to another zone.
|
|
3
|
-
class LinkedTimezoneInfo < TimezoneInfo
|
|
4
|
-
|
|
5
|
-
# The zone that provides the data (that this zone is an alias for).
|
|
6
|
-
attr_reader :link_to_identifier
|
|
7
|
-
|
|
8
|
-
# Constructs a new LinkedTimezoneInfo with an identifier and the identifier
|
|
9
|
-
# of the zone linked to.
|
|
10
|
-
def initialize(identifier, link_to_identifier)
|
|
11
|
-
super(identifier)
|
|
12
|
-
@link_to_identifier = link_to_identifier
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Returns internal object state as a programmer-readable string.
|
|
16
|
-
def inspect
|
|
17
|
-
"#<#{self.class}: #@identifier,#@link_to_identifier>"
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Constructs a Timezone instance for the timezone represented by this
|
|
21
|
-
# DataTimezoneInfo.
|
|
22
|
-
def create_timezone
|
|
23
|
-
LinkedTimezone.new(self)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
require 'rational' unless defined?(Rational)
|
|
2
|
-
|
|
3
|
-
module TZInfo
|
|
4
|
-
|
|
5
|
-
# Provides a method for getting Rationals for a timezone offset in seconds.
|
|
6
|
-
# Pre-reduced rationals are returned for all the half-hour intervals between
|
|
7
|
-
# -14 and +14 hours to avoid having to call gcd at runtime.
|
|
8
|
-
#
|
|
9
|
-
# @private
|
|
10
|
-
module OffsetRationals #:nodoc:
|
|
11
|
-
@@rational_cache = {
|
|
12
|
-
-50400 => RubyCoreSupport.rational_new!(-7,12),
|
|
13
|
-
-48600 => RubyCoreSupport.rational_new!(-9,16),
|
|
14
|
-
-46800 => RubyCoreSupport.rational_new!(-13,24),
|
|
15
|
-
-45000 => RubyCoreSupport.rational_new!(-25,48),
|
|
16
|
-
-43200 => RubyCoreSupport.rational_new!(-1,2),
|
|
17
|
-
-41400 => RubyCoreSupport.rational_new!(-23,48),
|
|
18
|
-
-39600 => RubyCoreSupport.rational_new!(-11,24),
|
|
19
|
-
-37800 => RubyCoreSupport.rational_new!(-7,16),
|
|
20
|
-
-36000 => RubyCoreSupport.rational_new!(-5,12),
|
|
21
|
-
-34200 => RubyCoreSupport.rational_new!(-19,48),
|
|
22
|
-
-32400 => RubyCoreSupport.rational_new!(-3,8),
|
|
23
|
-
-30600 => RubyCoreSupport.rational_new!(-17,48),
|
|
24
|
-
-28800 => RubyCoreSupport.rational_new!(-1,3),
|
|
25
|
-
-27000 => RubyCoreSupport.rational_new!(-5,16),
|
|
26
|
-
-25200 => RubyCoreSupport.rational_new!(-7,24),
|
|
27
|
-
-23400 => RubyCoreSupport.rational_new!(-13,48),
|
|
28
|
-
-21600 => RubyCoreSupport.rational_new!(-1,4),
|
|
29
|
-
-19800 => RubyCoreSupport.rational_new!(-11,48),
|
|
30
|
-
-18000 => RubyCoreSupport.rational_new!(-5,24),
|
|
31
|
-
-16200 => RubyCoreSupport.rational_new!(-3,16),
|
|
32
|
-
-14400 => RubyCoreSupport.rational_new!(-1,6),
|
|
33
|
-
-12600 => RubyCoreSupport.rational_new!(-7,48),
|
|
34
|
-
-10800 => RubyCoreSupport.rational_new!(-1,8),
|
|
35
|
-
-9000 => RubyCoreSupport.rational_new!(-5,48),
|
|
36
|
-
-7200 => RubyCoreSupport.rational_new!(-1,12),
|
|
37
|
-
-5400 => RubyCoreSupport.rational_new!(-1,16),
|
|
38
|
-
-3600 => RubyCoreSupport.rational_new!(-1,24),
|
|
39
|
-
-1800 => RubyCoreSupport.rational_new!(-1,48),
|
|
40
|
-
0 => RubyCoreSupport.rational_new!(0,1),
|
|
41
|
-
1800 => RubyCoreSupport.rational_new!(1,48),
|
|
42
|
-
3600 => RubyCoreSupport.rational_new!(1,24),
|
|
43
|
-
5400 => RubyCoreSupport.rational_new!(1,16),
|
|
44
|
-
7200 => RubyCoreSupport.rational_new!(1,12),
|
|
45
|
-
9000 => RubyCoreSupport.rational_new!(5,48),
|
|
46
|
-
10800 => RubyCoreSupport.rational_new!(1,8),
|
|
47
|
-
12600 => RubyCoreSupport.rational_new!(7,48),
|
|
48
|
-
14400 => RubyCoreSupport.rational_new!(1,6),
|
|
49
|
-
16200 => RubyCoreSupport.rational_new!(3,16),
|
|
50
|
-
18000 => RubyCoreSupport.rational_new!(5,24),
|
|
51
|
-
19800 => RubyCoreSupport.rational_new!(11,48),
|
|
52
|
-
21600 => RubyCoreSupport.rational_new!(1,4),
|
|
53
|
-
23400 => RubyCoreSupport.rational_new!(13,48),
|
|
54
|
-
25200 => RubyCoreSupport.rational_new!(7,24),
|
|
55
|
-
27000 => RubyCoreSupport.rational_new!(5,16),
|
|
56
|
-
28800 => RubyCoreSupport.rational_new!(1,3),
|
|
57
|
-
30600 => RubyCoreSupport.rational_new!(17,48),
|
|
58
|
-
32400 => RubyCoreSupport.rational_new!(3,8),
|
|
59
|
-
34200 => RubyCoreSupport.rational_new!(19,48),
|
|
60
|
-
36000 => RubyCoreSupport.rational_new!(5,12),
|
|
61
|
-
37800 => RubyCoreSupport.rational_new!(7,16),
|
|
62
|
-
39600 => RubyCoreSupport.rational_new!(11,24),
|
|
63
|
-
41400 => RubyCoreSupport.rational_new!(23,48),
|
|
64
|
-
43200 => RubyCoreSupport.rational_new!(1,2),
|
|
65
|
-
45000 => RubyCoreSupport.rational_new!(25,48),
|
|
66
|
-
46800 => RubyCoreSupport.rational_new!(13,24),
|
|
67
|
-
48600 => RubyCoreSupport.rational_new!(9,16),
|
|
68
|
-
50400 => RubyCoreSupport.rational_new!(7,12)}.freeze
|
|
69
|
-
|
|
70
|
-
# Returns a Rational expressing the fraction of a day that offset in
|
|
71
|
-
# seconds represents (i.e. equivalent to Rational(offset, 86400)).
|
|
72
|
-
def rational_for_offset(offset)
|
|
73
|
-
@@rational_cache[offset] || Rational(offset, 86400)
|
|
74
|
-
end
|
|
75
|
-
module_function :rational_for_offset
|
|
76
|
-
end
|
|
77
|
-
end
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
require 'date'
|
|
2
|
-
require 'rational' unless defined?(Rational)
|
|
3
|
-
|
|
4
|
-
module TZInfo
|
|
5
|
-
|
|
6
|
-
# Methods to support different versions of Ruby.
|
|
7
|
-
#
|
|
8
|
-
# @private
|
|
9
|
-
module RubyCoreSupport #:nodoc:
|
|
10
|
-
|
|
11
|
-
# Use Rational.new! for performance reasons in Ruby 1.8.
|
|
12
|
-
# This has been removed from 1.9, but Rational performs better.
|
|
13
|
-
if Rational.respond_to? :new!
|
|
14
|
-
def self.rational_new!(numerator, denominator = 1)
|
|
15
|
-
Rational.new!(numerator, denominator)
|
|
16
|
-
end
|
|
17
|
-
else
|
|
18
|
-
def self.rational_new!(numerator, denominator = 1)
|
|
19
|
-
Rational(numerator, denominator)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Ruby 1.8.6 introduced new! and deprecated new0.
|
|
24
|
-
# Ruby 1.9.0 removed new0.
|
|
25
|
-
# Ruby trunk revision 31668 removed the new! method.
|
|
26
|
-
# Still support new0 for better performance on older versions of Ruby (new0 indicates
|
|
27
|
-
# that the rational has already been reduced to its lowest terms).
|
|
28
|
-
# Fallback to jd with conversion from ajd if new! and new0 are unavailable.
|
|
29
|
-
if DateTime.respond_to? :new!
|
|
30
|
-
def self.datetime_new!(ajd = 0, of = 0, sg = Date::ITALY)
|
|
31
|
-
DateTime.new!(ajd, of, sg)
|
|
32
|
-
end
|
|
33
|
-
elsif DateTime.respond_to? :new0
|
|
34
|
-
def self.datetime_new!(ajd = 0, of = 0, sg = Date::ITALY)
|
|
35
|
-
DateTime.new0(ajd, of, sg)
|
|
36
|
-
end
|
|
37
|
-
else
|
|
38
|
-
HALF_DAYS_IN_DAY = rational_new!(1, 2)
|
|
39
|
-
|
|
40
|
-
def self.datetime_new!(ajd = 0, of = 0, sg = Date::ITALY)
|
|
41
|
-
# Convert from an Astronomical Julian Day number to a civil Julian Day number.
|
|
42
|
-
jd = ajd + of + HALF_DAYS_IN_DAY
|
|
43
|
-
|
|
44
|
-
# Ruby trunk revision 31862 changed the behaviour of DateTime.jd so that it will no
|
|
45
|
-
# longer accept a fractional civil Julian Day number if further arguments are specified.
|
|
46
|
-
# Calculate the hours, minutes and seconds to pass to jd.
|
|
47
|
-
|
|
48
|
-
jd_i = jd.to_i
|
|
49
|
-
jd_i -= 1 if jd < 0
|
|
50
|
-
hours = (jd - jd_i) * 24
|
|
51
|
-
hours_i = hours.to_i
|
|
52
|
-
minutes = (hours - hours_i) * 60
|
|
53
|
-
minutes_i = minutes.to_i
|
|
54
|
-
seconds = (minutes - minutes_i) * 60
|
|
55
|
-
|
|
56
|
-
DateTime.jd(jd_i, hours_i, minutes_i, seconds, of, sg)
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# DateTime in Ruby 1.8.6 doesn't consider times within the 60th second to be
|
|
61
|
-
# valid. When attempting to specify such a DateTime, subtract the fractional
|
|
62
|
-
# part and then add it back later
|
|
63
|
-
if Date.respond_to?(:valid_time?) && !Date.valid_time?(0, 0, rational_new!(59001, 1000)) # 0:0:59.001
|
|
64
|
-
def self.datetime_new(y=-4712, m=1, d=1, h=0, min=0, s=0, of=0, sg=Date::ITALY)
|
|
65
|
-
if !s.kind_of?(Integer) && s > 59
|
|
66
|
-
dt = DateTime.new(y, m, d, h, min, 59, of, sg)
|
|
67
|
-
dt + (s - 59) / 86400
|
|
68
|
-
else
|
|
69
|
-
DateTime.new(y, m, d, h, min, s, of, sg)
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
else
|
|
73
|
-
def self.datetime_new(y=-4712, m=1, d=1, h=0, min=0, s=0, of=0, sg=Date::ITALY)
|
|
74
|
-
DateTime.new(y, m, d, h, min, s, of, sg)
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Returns true if Time on the runtime platform supports Times defined
|
|
79
|
-
# by negative 32-bit timestamps, otherwise false.
|
|
80
|
-
begin
|
|
81
|
-
Time.at(-1)
|
|
82
|
-
Time.at(-2147483648)
|
|
83
|
-
|
|
84
|
-
def self.time_supports_negative
|
|
85
|
-
true
|
|
86
|
-
end
|
|
87
|
-
rescue ArgumentError
|
|
88
|
-
def self.time_supports_negative
|
|
89
|
-
false
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# Returns true if Time on the runtime platform supports Times defined by
|
|
94
|
-
# 64-bit timestamps, otherwise false.
|
|
95
|
-
begin
|
|
96
|
-
Time.at(-2147483649)
|
|
97
|
-
Time.at(2147483648)
|
|
98
|
-
|
|
99
|
-
def self.time_supports_64bit
|
|
100
|
-
true
|
|
101
|
-
end
|
|
102
|
-
rescue RangeError
|
|
103
|
-
def self.time_supports_64bit
|
|
104
|
-
false
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# Return the result of Time#nsec if it exists, otherwise return the
|
|
109
|
-
# result of Time#usec * 1000.
|
|
110
|
-
if Time.method_defined?(:nsec)
|
|
111
|
-
def self.time_nsec(time)
|
|
112
|
-
time.nsec
|
|
113
|
-
end
|
|
114
|
-
else
|
|
115
|
-
def self.time_nsec(time)
|
|
116
|
-
time.usec * 1000
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Call String#force_encoding if this version of Ruby has encoding support
|
|
121
|
-
# otherwise treat as a no-op.
|
|
122
|
-
if String.method_defined?(:force_encoding)
|
|
123
|
-
def self.force_encoding(str, encoding)
|
|
124
|
-
str.force_encoding(encoding)
|
|
125
|
-
end
|
|
126
|
-
else
|
|
127
|
-
def self.force_encoding(str, encoding)
|
|
128
|
-
str
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
# Wrapper for File.open that supports passing hash options for specifying
|
|
134
|
-
# encodings on Ruby 1.9+. The options are ignored on earlier versions of
|
|
135
|
-
# Ruby.
|
|
136
|
-
if RUBY_VERSION =~ /\A1\.[0-8]\./
|
|
137
|
-
def self.open_file(file_name, mode, opts, &block)
|
|
138
|
-
File.open(file_name, mode, &block)
|
|
139
|
-
end
|
|
140
|
-
elsif RUBY_VERSION =~ /\A1\.9\./
|
|
141
|
-
def self.open_file(file_name, mode, opts, &block)
|
|
142
|
-
File.open(file_name, mode, opts, &block)
|
|
143
|
-
end
|
|
144
|
-
else
|
|
145
|
-
# Evaluate method as a string because **opts isn't valid syntax prior to
|
|
146
|
-
# Ruby 2.0.
|
|
147
|
-
eval(<<-EOF
|
|
148
|
-
def self.open_file(file_name, mode, opts, &block)
|
|
149
|
-
File.open(file_name, mode, **opts, &block)
|
|
150
|
-
end
|
|
151
|
-
EOF
|
|
152
|
-
)
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
# Object#untaint is a deprecated no-op in Ruby >= 2.7 and will be removed in
|
|
157
|
-
# 3.2. Add a refinement to either silence the warning, or supply the method
|
|
158
|
-
# if needed.
|
|
159
|
-
if !Object.new.respond_to?(:untaint) || RUBY_VERSION =~ /\A(\d+)\.(\d+)(?:\.|\z)/ && ($1 == '2' && $2.to_i >= 7 || $1.to_i >= 3)
|
|
160
|
-
module UntaintExt
|
|
161
|
-
refine Object do
|
|
162
|
-
def untaint
|
|
163
|
-
self
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
module TZInfo
|
|
2
|
-
# Represents information about a country returned by RubyDataSource.
|
|
3
|
-
#
|
|
4
|
-
# @private
|
|
5
|
-
class RubyCountryInfo < CountryInfo #:nodoc:
|
|
6
|
-
# Constructs a new CountryInfo with an ISO 3166 country code, name and
|
|
7
|
-
# block. The block will be evaluated to obtain the timezones for the
|
|
8
|
-
# country when the zones are first needed.
|
|
9
|
-
def initialize(code, name, &block)
|
|
10
|
-
super(code, name)
|
|
11
|
-
@block = block
|
|
12
|
-
@zones = nil
|
|
13
|
-
@zone_identifiers = nil
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# Returns a frozen array of all the zone identifiers for the country. These
|
|
17
|
-
# are in the order they were added using the timezone method.
|
|
18
|
-
def zone_identifiers
|
|
19
|
-
# Thread-safety: It is possible that the value of @zone_identifiers may be
|
|
20
|
-
# calculated multiple times in concurrently executing threads. It is not
|
|
21
|
-
# worth the overhead of locking to ensure that @zone_identifiers is only
|
|
22
|
-
# calculated once.
|
|
23
|
-
|
|
24
|
-
unless @zone_identifiers
|
|
25
|
-
result = zones.collect {|zone| zone.identifier}.freeze
|
|
26
|
-
return result if frozen?
|
|
27
|
-
@zone_identifiers = result
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
@zone_identifiers
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Returns a frozen array of all the timezones for the for the country as
|
|
34
|
-
# CountryTimezone instances. These are in the order they were added using
|
|
35
|
-
# the timezone method.
|
|
36
|
-
def zones
|
|
37
|
-
# Thread-safety: It is possible that the value of @zones may be
|
|
38
|
-
# calculated multiple times in concurrently executing threads. It is not
|
|
39
|
-
# worth the overhead of locking to ensure that @zones is only
|
|
40
|
-
# calculated once.
|
|
41
|
-
|
|
42
|
-
unless @zones
|
|
43
|
-
zones = Zones.new
|
|
44
|
-
@block.call(zones) if @block
|
|
45
|
-
result = zones.list.freeze
|
|
46
|
-
return result if frozen?
|
|
47
|
-
@block = nil
|
|
48
|
-
@zones = result
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
@zones
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# An instance of the Zones class is passed to the block used to define
|
|
55
|
-
# timezones.
|
|
56
|
-
#
|
|
57
|
-
# @private
|
|
58
|
-
class Zones #:nodoc:
|
|
59
|
-
attr_reader :list
|
|
60
|
-
|
|
61
|
-
def initialize
|
|
62
|
-
@list = []
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Called by the index data to define a timezone for the country.
|
|
66
|
-
def timezone(identifier, latitude_numerator, latitude_denominator,
|
|
67
|
-
longitude_numerator, longitude_denominator, description = nil)
|
|
68
|
-
@list << CountryTimezone.new!(identifier, latitude_numerator,
|
|
69
|
-
latitude_denominator, longitude_numerator, longitude_denominator,
|
|
70
|
-
description)
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
module TZInfo
|
|
2
|
-
# Use send as a workaround for erroneous 'wrong number of arguments' errors
|
|
3
|
-
# with JRuby 9.0.5.0 when calling methods with Java implementations. See #114.
|
|
4
|
-
send(:using, RubyCoreSupport::UntaintExt) if RubyCoreSupport.const_defined?(:UntaintExt)
|
|
5
|
-
|
|
6
|
-
# A DataSource that loads data from the set of Ruby modules included in the
|
|
7
|
-
# TZInfo::Data library (tzinfo-data gem).
|
|
8
|
-
#
|
|
9
|
-
# To have TZInfo use this DataSource, call TZInfo::DataSource.set as follows:
|
|
10
|
-
#
|
|
11
|
-
# TZInfo::DataSource.set(:ruby)
|
|
12
|
-
class RubyDataSource < DataSource
|
|
13
|
-
# Whether the timezone index has been loaded yet.
|
|
14
|
-
@@timezone_index_loaded = false
|
|
15
|
-
|
|
16
|
-
# Whether the country index has been loaded yet.
|
|
17
|
-
@@country_index_loaded = false
|
|
18
|
-
|
|
19
|
-
# Initializes a new RubyDataSource instance.
|
|
20
|
-
def initialize
|
|
21
|
-
tzinfo_data = File.join('tzinfo', 'data')
|
|
22
|
-
begin
|
|
23
|
-
require(tzinfo_data)
|
|
24
|
-
|
|
25
|
-
data_file = File.join('', 'tzinfo', 'data.rb')
|
|
26
|
-
path = $".reverse_each.detect {|p| p.end_with?(data_file) }
|
|
27
|
-
if path
|
|
28
|
-
@base_path = File.join(File.dirname(path), 'data').untaint
|
|
29
|
-
else
|
|
30
|
-
@base_path = tzinfo_data
|
|
31
|
-
end
|
|
32
|
-
rescue LoadError
|
|
33
|
-
@base_path = tzinfo_data
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Returns a TimezoneInfo instance for a given identifier.
|
|
38
|
-
# Raises InvalidTimezoneIdentifier if the timezone is not found or the
|
|
39
|
-
# identifier is invalid.
|
|
40
|
-
def load_timezone_info(identifier)
|
|
41
|
-
raise InvalidTimezoneIdentifier, 'Invalid identifier' if identifier !~ /^[A-Za-z0-9\+\-_]+(\/[A-Za-z0-9\+\-_]+)*$/
|
|
42
|
-
|
|
43
|
-
identifier = identifier.gsub(/-/, '__m__').gsub(/\+/, '__p__')
|
|
44
|
-
|
|
45
|
-
# Untaint identifier after it has been reassigned to a new string. We
|
|
46
|
-
# don't want to modify the original identifier. identifier may also be
|
|
47
|
-
# frozen and therefore cannot be untainted.
|
|
48
|
-
identifier.untaint
|
|
49
|
-
|
|
50
|
-
identifier = identifier.split('/')
|
|
51
|
-
begin
|
|
52
|
-
require_definition(identifier)
|
|
53
|
-
|
|
54
|
-
m = Data::Definitions
|
|
55
|
-
identifier.each {|part|
|
|
56
|
-
m = m.const_get(part)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
m.get
|
|
60
|
-
rescue LoadError, NameError => e
|
|
61
|
-
raise InvalidTimezoneIdentifier, e.message
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Returns an array of all the available timezone identifiers.
|
|
66
|
-
def timezone_identifiers
|
|
67
|
-
load_timezone_index
|
|
68
|
-
Data::Indexes::Timezones.timezones
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Returns an array of all the available timezone identifiers for
|
|
72
|
-
# data timezones (i.e. those that actually contain definitions).
|
|
73
|
-
def data_timezone_identifiers
|
|
74
|
-
load_timezone_index
|
|
75
|
-
Data::Indexes::Timezones.data_timezones
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Returns an array of all the available timezone identifiers that
|
|
79
|
-
# are links to other timezones.
|
|
80
|
-
def linked_timezone_identifiers
|
|
81
|
-
load_timezone_index
|
|
82
|
-
Data::Indexes::Timezones.linked_timezones
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# Returns a CountryInfo instance for the given ISO 3166-1 alpha-2
|
|
86
|
-
# country code. Raises InvalidCountryCode if the country could not be found
|
|
87
|
-
# or the code is invalid.
|
|
88
|
-
def load_country_info(code)
|
|
89
|
-
load_country_index
|
|
90
|
-
info = Data::Indexes::Countries.countries[code]
|
|
91
|
-
raise InvalidCountryCode, 'Invalid country code' unless info
|
|
92
|
-
info
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Returns an array of all the available ISO 3166-1 alpha-2
|
|
96
|
-
# country codes.
|
|
97
|
-
def country_codes
|
|
98
|
-
load_country_index
|
|
99
|
-
Data::Indexes::Countries.countries.keys.freeze
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Returns the name of this DataSource.
|
|
103
|
-
def to_s
|
|
104
|
-
"Ruby DataSource"
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
private
|
|
108
|
-
|
|
109
|
-
# Requires a zone definition by its identifier (split on /).
|
|
110
|
-
def require_definition(identifier)
|
|
111
|
-
require_data(*(['definitions'] + identifier))
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# Requires an index by its name.
|
|
115
|
-
def require_index(name)
|
|
116
|
-
require_data(*['indexes', name])
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# Requires a file from tzinfo/data.
|
|
120
|
-
def require_data(*file)
|
|
121
|
-
require(File.join(@base_path, *file))
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# Loads in the index of timezones if it hasn't already been loaded.
|
|
125
|
-
def load_timezone_index
|
|
126
|
-
unless @@timezone_index_loaded
|
|
127
|
-
require_index('timezones')
|
|
128
|
-
@@timezone_index_loaded = true
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# Loads in the index of countries if it hasn't already been loaded.
|
|
133
|
-
def load_country_index
|
|
134
|
-
unless @@country_index_loaded
|
|
135
|
-
require_index('countries')
|
|
136
|
-
@@country_index_loaded = true
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|