time_crisis 0.1.8 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/VERSION.yml +2 -2
  2. data/lib/time_crisis.rb +5 -12
  3. data/lib/time_crisis/ext.rb +60 -0
  4. data/lib/time_crisis/support/conversions.rb +4 -0
  5. data/lib/time_crisis/tzinfo.rb +3 -0
  6. data/lib/time_crisis/tzinfo/LICENSE +21 -0
  7. data/lib/time_crisis/tzinfo/data_timezone.rb +27 -0
  8. data/lib/time_crisis/tzinfo/data_timezone_info.rb +208 -0
  9. data/lib/time_crisis/tzinfo/definitions/Africa/Algiers.rb +55 -0
  10. data/lib/time_crisis/tzinfo/definitions/Africa/Cairo.rb +219 -0
  11. data/lib/time_crisis/tzinfo/definitions/Africa/Casablanca.rb +42 -0
  12. data/lib/time_crisis/tzinfo/definitions/Africa/Harare.rb +18 -0
  13. data/lib/time_crisis/tzinfo/definitions/Africa/Johannesburg.rb +25 -0
  14. data/lib/time_crisis/tzinfo/definitions/Africa/Monrovia.rb +22 -0
  15. data/lib/time_crisis/tzinfo/definitions/Africa/Nairobi.rb +23 -0
  16. data/lib/time_crisis/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +84 -0
  17. data/lib/time_crisis/tzinfo/definitions/America/Argentina/San_Juan.rb +86 -0
  18. data/lib/time_crisis/tzinfo/definitions/America/Bogota.rb +23 -0
  19. data/lib/time_crisis/tzinfo/definitions/America/Caracas.rb +23 -0
  20. data/lib/time_crisis/tzinfo/definitions/America/Chicago.rb +283 -0
  21. data/lib/time_crisis/tzinfo/definitions/America/Chihuahua.rb +136 -0
  22. data/lib/time_crisis/tzinfo/definitions/America/Denver.rb +204 -0
  23. data/lib/time_crisis/tzinfo/definitions/America/Godthab.rb +161 -0
  24. data/lib/time_crisis/tzinfo/definitions/America/Guatemala.rb +27 -0
  25. data/lib/time_crisis/tzinfo/definitions/America/Halifax.rb +274 -0
  26. data/lib/time_crisis/tzinfo/definitions/America/Indiana/Indianapolis.rb +149 -0
  27. data/lib/time_crisis/tzinfo/definitions/America/Juneau.rb +194 -0
  28. data/lib/time_crisis/tzinfo/definitions/America/La_Paz.rb +22 -0
  29. data/lib/time_crisis/tzinfo/definitions/America/Lima.rb +35 -0
  30. data/lib/time_crisis/tzinfo/definitions/America/Los_Angeles.rb +232 -0
  31. data/lib/time_crisis/tzinfo/definitions/America/Mazatlan.rb +139 -0
  32. data/lib/time_crisis/tzinfo/definitions/America/Mexico_City.rb +144 -0
  33. data/lib/time_crisis/tzinfo/definitions/America/Monterrey.rb +131 -0
  34. data/lib/time_crisis/tzinfo/definitions/America/New_York.rb +282 -0
  35. data/lib/time_crisis/tzinfo/definitions/America/Phoenix.rb +30 -0
  36. data/lib/time_crisis/tzinfo/definitions/America/Regina.rb +74 -0
  37. data/lib/time_crisis/tzinfo/definitions/America/Santiago.rb +205 -0
  38. data/lib/time_crisis/tzinfo/definitions/America/Sao_Paulo.rb +171 -0
  39. data/lib/time_crisis/tzinfo/definitions/America/St_Johns.rb +288 -0
  40. data/lib/time_crisis/tzinfo/definitions/America/Tijuana.rb +196 -0
  41. data/lib/time_crisis/tzinfo/definitions/Asia/Almaty.rb +67 -0
  42. data/lib/time_crisis/tzinfo/definitions/Asia/Baghdad.rb +73 -0
  43. data/lib/time_crisis/tzinfo/definitions/Asia/Baku.rb +161 -0
  44. data/lib/time_crisis/tzinfo/definitions/Asia/Bangkok.rb +20 -0
  45. data/lib/time_crisis/tzinfo/definitions/Asia/Chongqing.rb +33 -0
  46. data/lib/time_crisis/tzinfo/definitions/Asia/Colombo.rb +30 -0
  47. data/lib/time_crisis/tzinfo/definitions/Asia/Dhaka.rb +29 -0
  48. data/lib/time_crisis/tzinfo/definitions/Asia/Hong_Kong.rb +87 -0
  49. data/lib/time_crisis/tzinfo/definitions/Asia/Irkutsk.rb +165 -0
  50. data/lib/time_crisis/tzinfo/definitions/Asia/Jakarta.rb +30 -0
  51. data/lib/time_crisis/tzinfo/definitions/Asia/Jerusalem.rb +163 -0
  52. data/lib/time_crisis/tzinfo/definitions/Asia/Kabul.rb +20 -0
  53. data/lib/time_crisis/tzinfo/definitions/Asia/Kamchatka.rb +163 -0
  54. data/lib/time_crisis/tzinfo/definitions/Asia/Karachi.rb +114 -0
  55. data/lib/time_crisis/tzinfo/definitions/Asia/Kathmandu.rb +20 -0
  56. data/lib/time_crisis/tzinfo/definitions/Asia/Kolkata.rb +25 -0
  57. data/lib/time_crisis/tzinfo/definitions/Asia/Krasnoyarsk.rb +163 -0
  58. data/lib/time_crisis/tzinfo/definitions/Asia/Kuala_Lumpur.rb +31 -0
  59. data/lib/time_crisis/tzinfo/definitions/Asia/Kuwait.rb +18 -0
  60. data/lib/time_crisis/tzinfo/definitions/Asia/Magadan.rb +163 -0
  61. data/lib/time_crisis/tzinfo/definitions/Asia/Muscat.rb +18 -0
  62. data/lib/time_crisis/tzinfo/definitions/Asia/Novosibirsk.rb +164 -0
  63. data/lib/time_crisis/tzinfo/definitions/Asia/Rangoon.rb +24 -0
  64. data/lib/time_crisis/tzinfo/definitions/Asia/Riyadh.rb +18 -0
  65. data/lib/time_crisis/tzinfo/definitions/Asia/Seoul.rb +34 -0
  66. data/lib/time_crisis/tzinfo/definitions/Asia/Shanghai.rb +35 -0
  67. data/lib/time_crisis/tzinfo/definitions/Asia/Singapore.rb +33 -0
  68. data/lib/time_crisis/tzinfo/definitions/Asia/Taipei.rb +59 -0
  69. data/lib/time_crisis/tzinfo/definitions/Asia/Tashkent.rb +47 -0
  70. data/lib/time_crisis/tzinfo/definitions/Asia/Tbilisi.rb +78 -0
  71. data/lib/time_crisis/tzinfo/definitions/Asia/Tehran.rb +121 -0
  72. data/lib/time_crisis/tzinfo/definitions/Asia/Tokyo.rb +30 -0
  73. data/lib/time_crisis/tzinfo/definitions/Asia/Ulaanbaatar.rb +65 -0
  74. data/lib/time_crisis/tzinfo/definitions/Asia/Urumqi.rb +33 -0
  75. data/lib/time_crisis/tzinfo/definitions/Asia/Vladivostok.rb +164 -0
  76. data/lib/time_crisis/tzinfo/definitions/Asia/Yakutsk.rb +163 -0
  77. data/lib/time_crisis/tzinfo/definitions/Asia/Yekaterinburg.rb +165 -0
  78. data/lib/time_crisis/tzinfo/definitions/Asia/Yerevan.rb +165 -0
  79. data/lib/time_crisis/tzinfo/definitions/Atlantic/Azores.rb +270 -0
  80. data/lib/time_crisis/tzinfo/definitions/Atlantic/Cape_Verde.rb +23 -0
  81. data/lib/time_crisis/tzinfo/definitions/Atlantic/South_Georgia.rb +18 -0
  82. data/lib/time_crisis/tzinfo/definitions/Australia/Adelaide.rb +187 -0
  83. data/lib/time_crisis/tzinfo/definitions/Australia/Brisbane.rb +35 -0
  84. data/lib/time_crisis/tzinfo/definitions/Australia/Darwin.rb +29 -0
  85. data/lib/time_crisis/tzinfo/definitions/Australia/Hobart.rb +193 -0
  86. data/lib/time_crisis/tzinfo/definitions/Australia/Melbourne.rb +185 -0
  87. data/lib/time_crisis/tzinfo/definitions/Australia/Perth.rb +37 -0
  88. data/lib/time_crisis/tzinfo/definitions/Australia/Sydney.rb +185 -0
  89. data/lib/time_crisis/tzinfo/definitions/Etc/UTC.rb +16 -0
  90. data/lib/time_crisis/tzinfo/definitions/Europe/Amsterdam.rb +228 -0
  91. data/lib/time_crisis/tzinfo/definitions/Europe/Athens.rb +185 -0
  92. data/lib/time_crisis/tzinfo/definitions/Europe/Belgrade.rb +163 -0
  93. data/lib/time_crisis/tzinfo/definitions/Europe/Berlin.rb +188 -0
  94. data/lib/time_crisis/tzinfo/definitions/Europe/Bratislava.rb +13 -0
  95. data/lib/time_crisis/tzinfo/definitions/Europe/Brussels.rb +232 -0
  96. data/lib/time_crisis/tzinfo/definitions/Europe/Bucharest.rb +181 -0
  97. data/lib/time_crisis/tzinfo/definitions/Europe/Budapest.rb +197 -0
  98. data/lib/time_crisis/tzinfo/definitions/Europe/Copenhagen.rb +179 -0
  99. data/lib/time_crisis/tzinfo/definitions/Europe/Dublin.rb +276 -0
  100. data/lib/time_crisis/tzinfo/definitions/Europe/Helsinki.rb +163 -0
  101. data/lib/time_crisis/tzinfo/definitions/Europe/Istanbul.rb +218 -0
  102. data/lib/time_crisis/tzinfo/definitions/Europe/Kiev.rb +168 -0
  103. data/lib/time_crisis/tzinfo/definitions/Europe/Lisbon.rb +268 -0
  104. data/lib/time_crisis/tzinfo/definitions/Europe/Ljubljana.rb +13 -0
  105. data/lib/time_crisis/tzinfo/definitions/Europe/London.rb +288 -0
  106. data/lib/time_crisis/tzinfo/definitions/Europe/Madrid.rb +211 -0
  107. data/lib/time_crisis/tzinfo/definitions/Europe/Minsk.rb +170 -0
  108. data/lib/time_crisis/tzinfo/definitions/Europe/Moscow.rb +181 -0
  109. data/lib/time_crisis/tzinfo/definitions/Europe/Paris.rb +232 -0
  110. data/lib/time_crisis/tzinfo/definitions/Europe/Prague.rb +187 -0
  111. data/lib/time_crisis/tzinfo/definitions/Europe/Riga.rb +176 -0
  112. data/lib/time_crisis/tzinfo/definitions/Europe/Rome.rb +215 -0
  113. data/lib/time_crisis/tzinfo/definitions/Europe/Sarajevo.rb +13 -0
  114. data/lib/time_crisis/tzinfo/definitions/Europe/Skopje.rb +13 -0
  115. data/lib/time_crisis/tzinfo/definitions/Europe/Sofia.rb +173 -0
  116. data/lib/time_crisis/tzinfo/definitions/Europe/Stockholm.rb +165 -0
  117. data/lib/time_crisis/tzinfo/definitions/Europe/Tallinn.rb +172 -0
  118. data/lib/time_crisis/tzinfo/definitions/Europe/Vienna.rb +183 -0
  119. data/lib/time_crisis/tzinfo/definitions/Europe/Vilnius.rb +170 -0
  120. data/lib/time_crisis/tzinfo/definitions/Europe/Warsaw.rb +212 -0
  121. data/lib/time_crisis/tzinfo/definitions/Europe/Zagreb.rb +13 -0
  122. data/lib/time_crisis/tzinfo/definitions/Pacific/Auckland.rb +202 -0
  123. data/lib/time_crisis/tzinfo/definitions/Pacific/Fiji.rb +23 -0
  124. data/lib/time_crisis/tzinfo/definitions/Pacific/Guam.rb +22 -0
  125. data/lib/time_crisis/tzinfo/definitions/Pacific/Honolulu.rb +28 -0
  126. data/lib/time_crisis/tzinfo/definitions/Pacific/Majuro.rb +20 -0
  127. data/lib/time_crisis/tzinfo/definitions/Pacific/Midway.rb +25 -0
  128. data/lib/time_crisis/tzinfo/definitions/Pacific/Noumea.rb +25 -0
  129. data/lib/time_crisis/tzinfo/definitions/Pacific/Pago_Pago.rb +26 -0
  130. data/lib/time_crisis/tzinfo/definitions/Pacific/Port_Moresby.rb +20 -0
  131. data/lib/time_crisis/tzinfo/definitions/Pacific/Tongatapu.rb +27 -0
  132. data/lib/time_crisis/tzinfo/info_timezone.rb +32 -0
  133. data/lib/time_crisis/tzinfo/linked_timezone.rb +32 -0
  134. data/lib/time_crisis/tzinfo/linked_timezone_info.rb +24 -0
  135. data/lib/time_crisis/tzinfo/offset_rationals.rb +79 -0
  136. data/lib/time_crisis/tzinfo/ruby_core_support.rb +33 -0
  137. data/lib/time_crisis/tzinfo/time_or_datetime.rb +309 -0
  138. data/lib/time_crisis/tzinfo/timezone.rb +486 -0
  139. data/lib/time_crisis/tzinfo/timezone_definition.rb +36 -0
  140. data/lib/time_crisis/tzinfo/timezone_info.rb +20 -0
  141. data/lib/time_crisis/tzinfo/timezone_offset_info.rb +75 -0
  142. data/lib/time_crisis/tzinfo/timezone_period.rb +179 -0
  143. data/lib/time_crisis/tzinfo/timezone_transition_info.rb +109 -0
  144. data/time_crisis.gemspec +142 -2
  145. metadata +142 -2
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
- :minor: 1
4
- :patch: 8
5
3
  :build:
4
+ :minor: 2
5
+ :patch: 0
@@ -1,18 +1,12 @@
1
- unless defined?(Date)
2
- begin
3
- require 'date'
4
- rescue LoadError
5
- end
6
- end
1
+ require 'date'
2
+ require 'time'
7
3
 
8
4
  require 'third_base'
5
+ TimeCrisis = ThirdBase
6
+ require 'time_crisis/ext'
9
7
 
10
- TimeCrisis = ThirdBase.dup
11
-
12
- # add needed bits of active support to time crisis
13
- # necessary now that it uses ThirdBase
8
+ require 'time_crisis/tzinfo'
14
9
  require 'time_crisis/support'
15
-
16
10
  require 'time_crisis/meteorological_seasons'
17
11
  require 'time_crisis/date_range'
18
12
  require 'time_crisis/named_months'
@@ -20,7 +14,6 @@ require 'time_crisis/weekend'
20
14
  require 'time_crisis/nth_weekday'
21
15
  require 'time_crisis/holiday'
22
16
 
23
- # TODO: make this less of an ugly hack
24
17
  module TimeCrisis
25
18
  class DateTime
26
19
  ENVMUTEX = Mutex.new
@@ -0,0 +1,60 @@
1
+ module TimeCrisis
2
+ class DateTime
3
+ attr_accessor :offset
4
+
5
+ def new_offset(n)
6
+ self.offset = n
7
+ end
8
+
9
+ def +(d)
10
+ case
11
+ when d.is_a?(Integer)
12
+ new_jd(jd+d)
13
+ when d.respond_to?(:to_f)
14
+ d, f = d.to_f.divmod(1)
15
+ f = fract + f
16
+ m, f = f.divmod(1)
17
+ self.class.jd_fract(jd+d+m, f, @offset)
18
+ else
19
+ raise TypeError, "d must be an Integer or respond to :to_f"
20
+ end
21
+ end
22
+
23
+ def -(d)
24
+ case
25
+ when d.is_a?(::TimeCrisis::DateTime)
26
+ (jd - d.jd) + (fract - d.fract) + (@offset - d.offset)/86400.0
27
+ when d.is_a?(Integer)
28
+ self + -d
29
+ when d.respond_to?(:to_f)
30
+ self + -(d.to_f)
31
+ else
32
+ raise TypeError, "d should be a TimeCrisis::DateTime, Integer, or respond to :to_f"
33
+ end
34
+ end
35
+
36
+ def <=>(datetime)
37
+ case
38
+ when datetime.is_a?(::TimeCrisis::DateTime)
39
+ ((d = super) == 0) && ((d = (hour <=> datetime.hour)) == 0) && ((d = (min <=> datetime.min)) == 0) && ((d = (sec <=> datetime.sec)) == 0) && ((d = (usec <=> datetime.usec)) == 0)
40
+ d
41
+ when datetime.is_a?(Integer)
42
+ if ((d = (jd <=> datetime)) == 0)
43
+ (hour == 0 and min == 0 and sec == 0 and usec == 0) ? 0 : 1
44
+ else
45
+ d
46
+ end
47
+ when datetime.respond_to?(:to_f)
48
+ diff = jd+fract - datetime.to_f
49
+ if diff.abs <= 1.15740740740741e-011
50
+ 0
51
+ else
52
+ diff > 0.0 ? 1 : -1
53
+ end
54
+ else
55
+ raise TypeError, "d should be a TimeCrisis::DateTime, Integer, or respond to :to_f"
56
+ end
57
+ end
58
+
59
+ end
60
+ end
@@ -77,6 +77,10 @@ module TimeCrisis::Support::Conversions
77
77
  ::Date.civil(year, month, day)
78
78
  end
79
79
 
80
+ def to_datetime
81
+ ::DateTime.civil(year, month, day, hour, minute, second, Rational(offset, 86400))
82
+ end
83
+
80
84
  def to_time
81
85
  ::Time.at(strftime('%s').to_i)
82
86
  end
@@ -0,0 +1,3 @@
1
+ require 'time_crisis/tzinfo/timezone'
2
+ require 'time_crisis/tzinfo/data_timezone'
3
+ require 'time_crisis/tzinfo/linked_timezone'
@@ -0,0 +1,21 @@
1
+ #--
2
+ # Copyright (c) 2008 Philip Ross
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in all
12
+ # copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #++
@@ -0,0 +1,27 @@
1
+ require 'time_crisis/tzinfo/info_timezone'
2
+
3
+ module TimeCrisis
4
+ module TZInfo
5
+
6
+ # A Timezone based on a DataTimezoneInfo.
7
+ class DataTimezone < InfoTimezone #:nodoc:
8
+
9
+ # Returns the TimezonePeriod for the given UTC time. utc can either be
10
+ # a DateTime, Time or integer timestamp (Time.to_i). Any timezone
11
+ # information in utc is ignored (it is treated as a UTC time).
12
+ #
13
+ # If no TimezonePeriod could be found, PeriodNotFound is raised.
14
+ def period_for_utc(utc)
15
+ info.period_for_utc(utc)
16
+ end
17
+
18
+ # Returns the set of TimezonePeriod instances that are valid for the given
19
+ # local time as an array. If you just want a single period, use
20
+ # period_for_local instead and specify how abiguities should be resolved.
21
+ # Raises PeriodNotFound if no periods are found for the given time.
22
+ def periods_for_local(local)
23
+ info.periods_for_local(local)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,208 @@
1
+ require 'time_crisis/tzinfo/time_or_datetime'
2
+ require 'time_crisis/tzinfo/timezone_info'
3
+ require 'time_crisis/tzinfo/timezone_offset_info'
4
+ require 'time_crisis/tzinfo/timezone_period'
5
+ require 'time_crisis/tzinfo/timezone_transition_info'
6
+
7
+ module TimeCrisis
8
+ module TZInfo
9
+ # Thrown if no offsets have been defined when calling period_for_utc or
10
+ # periods_for_local. Indicates an error in the timezone data.
11
+ class NoOffsetsDefined < StandardError
12
+ end
13
+
14
+ # Represents a (non-linked) timezone defined in a data module.
15
+ class DataTimezoneInfo < TimezoneInfo #:nodoc:
16
+
17
+ # Constructs a new TimezoneInfo with its identifier.
18
+ def initialize(identifier)
19
+ super(identifier)
20
+ @offsets = {}
21
+ @transitions = []
22
+ @previous_offset = nil
23
+ @transitions_index = nil
24
+ end
25
+
26
+ # Defines a offset. The id uniquely identifies this offset within the
27
+ # timezone. utc_offset and std_offset define the offset in seconds of
28
+ # standard time from UTC and daylight savings from standard time
29
+ # respectively. abbreviation describes the timezone offset (e.g. GMT, BST,
30
+ # EST or EDT).
31
+ #
32
+ # The first offset to be defined is treated as the offset that applies
33
+ # until the first transition. This will usually be in Local Mean Time (LMT).
34
+ #
35
+ # ArgumentError will be raised if the id is already defined.
36
+ def offset(id, utc_offset, std_offset, abbreviation)
37
+ raise ArgumentError, 'Offset already defined' if @offsets.has_key?(id)
38
+
39
+ offset = TimezoneOffsetInfo.new(utc_offset, std_offset, abbreviation)
40
+ @offsets[id] = offset
41
+ @previous_offset = offset unless @previous_offset
42
+ end
43
+
44
+ # Defines a transition. Transitions must be defined in chronological order.
45
+ # ArgumentError will be raised if a transition is added out of order.
46
+ # offset_id refers to an id defined with offset. ArgumentError will be
47
+ # raised if the offset_id cannot be found. numerator_or_time and
48
+ # denomiator specify the time the transition occurs as. See
49
+ # TimezoneTransitionInfo for more detail about specifying times.
50
+ def transition(year, month, offset_id, numerator_or_time, denominator = nil)
51
+ offset = @offsets[offset_id]
52
+ raise ArgumentError, 'Offset not found' unless offset
53
+
54
+ if @transitions_index
55
+ if year < @last_year || (year == @last_year && month < @last_month)
56
+ raise ArgumentError, 'Transitions must be increasing date order'
57
+ end
58
+
59
+ # Record the position of the first transition with this index.
60
+ index = transition_index(year, month)
61
+ @transitions_index[index] ||= @transitions.length
62
+
63
+ # Fill in any gaps
64
+ (index - 1).downto(0) do |i|
65
+ break if @transitions_index[i]
66
+ @transitions_index[i] = @transitions.length
67
+ end
68
+ else
69
+ @transitions_index = [@transitions.length]
70
+ @start_year = year
71
+ @start_month = month
72
+ end
73
+
74
+ @transitions << TimezoneTransitionInfo.new(offset, @previous_offset,
75
+ numerator_or_time, denominator)
76
+ @last_year = year
77
+ @last_month = month
78
+ @previous_offset = offset
79
+ end
80
+
81
+ # Returns the TimezonePeriod for the given UTC time.
82
+ # Raises NoOffsetsDefined if no offsets have been defined.
83
+ def period_for_utc(utc)
84
+ unless @transitions.empty?
85
+ utc = TimeOrDateTime.wrap(utc)
86
+ index = transition_index(utc.year, utc.mon)
87
+
88
+ start_transition = nil
89
+ start = transition_before_end(index)
90
+ if start
91
+ start.downto(0) do |i|
92
+ if @transitions[i].at <= utc
93
+ start_transition = @transitions[i]
94
+ break
95
+ end
96
+ end
97
+ end
98
+
99
+ end_transition = nil
100
+ start = transition_after_start(index)
101
+ if start
102
+ start.upto(@transitions.length - 1) do |i|
103
+ if @transitions[i].at > utc
104
+ end_transition = @transitions[i]
105
+ break
106
+ end
107
+ end
108
+ end
109
+
110
+ if start_transition || end_transition
111
+ TimezonePeriod.new(start_transition, end_transition)
112
+ else
113
+ # Won't happen since there are transitions. Must always find one
114
+ # transition that is either >= or < the specified time.
115
+ raise 'No transitions found in search'
116
+ end
117
+ else
118
+ raise NoOffsetsDefined, 'No offsets have been defined' unless @previous_offset
119
+ TimezonePeriod.new(nil, nil, @previous_offset)
120
+ end
121
+ end
122
+
123
+ # Returns the set of TimezonePeriods for the given local time as an array.
124
+ # Results returned are ordered by increasing UTC start date.
125
+ # Returns an empty array if no periods are found for the given time.
126
+ # Raises NoOffsetsDefined if no offsets have been defined.
127
+ def periods_for_local(local)
128
+ unless @transitions.empty?
129
+ local = TimeOrDateTime.wrap(local)
130
+ index = transition_index(local.year, local.mon)
131
+
132
+ result = []
133
+
134
+ start_index = transition_after_start(index - 1)
135
+ if start_index && @transitions[start_index].local_end > local
136
+ if start_index > 0
137
+ if @transitions[start_index - 1].local_start <= local
138
+ result << TimezonePeriod.new(@transitions[start_index - 1], @transitions[start_index])
139
+ end
140
+ else
141
+ result << TimezonePeriod.new(nil, @transitions[start_index])
142
+ end
143
+ end
144
+
145
+ end_index = transition_before_end(index + 1)
146
+
147
+ if end_index
148
+ start_index = end_index unless start_index
149
+
150
+ start_index.upto(transition_before_end(index + 1)) do |i|
151
+ if @transitions[i].local_start <= local
152
+ if i + 1 < @transitions.length
153
+ if @transitions[i + 1].local_end > local
154
+ result << TimezonePeriod.new(@transitions[i], @transitions[i + 1])
155
+ end
156
+ else
157
+ result << TimezonePeriod.new(@transitions[i], nil)
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ result
164
+ else
165
+ raise NoOffsetsDefined, 'No offsets have been defined' unless @previous_offset
166
+ [TimezonePeriod.new(nil, nil, @previous_offset)]
167
+ end
168
+ end
169
+
170
+ private
171
+ # Returns the index into the @transitions_index array for a given year
172
+ # and month.
173
+ def transition_index(year, month)
174
+ index = (year - @start_year) * 2
175
+ index += 1 if month > 6
176
+ index -= 1 if @start_month > 6
177
+ index
178
+ end
179
+
180
+ # Returns the index into @transitions of the first transition that occurs
181
+ # on or after the start of the given index into @transitions_index.
182
+ # Returns nil if there are no such transitions.
183
+ def transition_after_start(index)
184
+ if index >= @transitions_index.length
185
+ nil
186
+ else
187
+ index = 0 if index < 0
188
+ @transitions_index[index]
189
+ end
190
+ end
191
+
192
+ # Returns the index into @transitions of the first transition that occurs
193
+ # before the end of the given index into @transitions_index.
194
+ # Returns nil if there are no such transitions.
195
+ def transition_before_end(index)
196
+ index = index + 1
197
+
198
+ if index <= 0
199
+ nil
200
+ elsif index >= @transitions_index.length
201
+ @transitions.length - 1
202
+ else
203
+ @transitions_index[index] - 1
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,55 @@
1
+ require 'time_crisis/tzinfo/timezone_definition'
2
+
3
+ module TimeCrisis::TZInfo
4
+ module Definitions
5
+ module Africa
6
+ module Algiers
7
+ include TimezoneDefinition
8
+
9
+ timezone 'Africa/Algiers' do |tz|
10
+ tz.offset :o0, 732, 0, :LMT
11
+ tz.offset :o1, 561, 0, :PMT
12
+ tz.offset :o2, 0, 0, :WET
13
+ tz.offset :o3, 0, 3600, :WEST
14
+ tz.offset :o4, 3600, 0, :CET
15
+ tz.offset :o5, 3600, 3600, :CEST
16
+
17
+ tz.transition 1891, 3, :o1, 2170625843, 900
18
+ tz.transition 1911, 3, :o2, 69670267013, 28800
19
+ tz.transition 1916, 6, :o3, 58104707, 24
20
+ tz.transition 1916, 10, :o2, 58107323, 24
21
+ tz.transition 1917, 3, :o3, 58111499, 24
22
+ tz.transition 1917, 10, :o2, 58116227, 24
23
+ tz.transition 1918, 3, :o3, 58119899, 24
24
+ tz.transition 1918, 10, :o2, 58124963, 24
25
+ tz.transition 1919, 3, :o3, 58128467, 24
26
+ tz.transition 1919, 10, :o2, 58133699, 24
27
+ tz.transition 1920, 2, :o3, 58136867, 24
28
+ tz.transition 1920, 10, :o2, 58142915, 24
29
+ tz.transition 1921, 3, :o3, 58146323, 24
30
+ tz.transition 1921, 6, :o2, 58148699, 24
31
+ tz.transition 1939, 9, :o3, 58308443, 24
32
+ tz.transition 1939, 11, :o2, 4859173, 2
33
+ tz.transition 1940, 2, :o4, 29156215, 12
34
+ tz.transition 1944, 4, :o5, 58348405, 24
35
+ tz.transition 1944, 10, :o4, 4862743, 2
36
+ tz.transition 1945, 4, :o5, 58357141, 24
37
+ tz.transition 1945, 9, :o4, 58361147, 24
38
+ tz.transition 1946, 10, :o2, 58370411, 24
39
+ tz.transition 1956, 1, :o4, 4871003, 2
40
+ tz.transition 1963, 4, :o2, 58515203, 24
41
+ tz.transition 1971, 4, :o3, 41468400
42
+ tz.transition 1971, 9, :o2, 54774000
43
+ tz.transition 1977, 5, :o3, 231724800
44
+ tz.transition 1977, 10, :o4, 246236400
45
+ tz.transition 1978, 3, :o5, 259545600
46
+ tz.transition 1978, 9, :o4, 275274000
47
+ tz.transition 1979, 10, :o2, 309740400
48
+ tz.transition 1980, 4, :o3, 325468800
49
+ tz.transition 1980, 10, :o2, 341802000
50
+ tz.transition 1981, 5, :o4, 357523200
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,219 @@
1
+ require 'time_crisis/tzinfo/timezone_definition'
2
+
3
+ module TimeCrisis::TZInfo
4
+ module Definitions
5
+ module Africa
6
+ module Cairo
7
+ include TimezoneDefinition
8
+
9
+ timezone 'Africa/Cairo' do |tz|
10
+ tz.offset :o0, 7500, 0, :LMT
11
+ tz.offset :o1, 7200, 0, :EET
12
+ tz.offset :o2, 7200, 3600, :EEST
13
+
14
+ tz.transition 1900, 9, :o1, 695604503, 288
15
+ tz.transition 1940, 7, :o2, 29157905, 12
16
+ tz.transition 1940, 9, :o1, 19439227, 8
17
+ tz.transition 1941, 4, :o2, 29161193, 12
18
+ tz.transition 1941, 9, :o1, 19442027, 8
19
+ tz.transition 1942, 3, :o2, 29165405, 12
20
+ tz.transition 1942, 10, :o1, 19445275, 8
21
+ tz.transition 1943, 3, :o2, 29169785, 12
22
+ tz.transition 1943, 10, :o1, 19448235, 8
23
+ tz.transition 1944, 3, :o2, 29174177, 12
24
+ tz.transition 1944, 10, :o1, 19451163, 8
25
+ tz.transition 1945, 4, :o2, 29178737, 12
26
+ tz.transition 1945, 10, :o1, 19454083, 8
27
+ tz.transition 1957, 5, :o2, 29231621, 12
28
+ tz.transition 1957, 9, :o1, 19488899, 8
29
+ tz.transition 1958, 4, :o2, 29235893, 12
30
+ tz.transition 1958, 9, :o1, 19491819, 8
31
+ tz.transition 1959, 4, :o2, 58480547, 24
32
+ tz.transition 1959, 9, :o1, 4873683, 2
33
+ tz.transition 1960, 4, :o2, 58489331, 24
34
+ tz.transition 1960, 9, :o1, 4874415, 2
35
+ tz.transition 1961, 4, :o2, 58498091, 24
36
+ tz.transition 1961, 9, :o1, 4875145, 2
37
+ tz.transition 1962, 4, :o2, 58506851, 24
38
+ tz.transition 1962, 9, :o1, 4875875, 2
39
+ tz.transition 1963, 4, :o2, 58515611, 24
40
+ tz.transition 1963, 9, :o1, 4876605, 2
41
+ tz.transition 1964, 4, :o2, 58524395, 24
42
+ tz.transition 1964, 9, :o1, 4877337, 2
43
+ tz.transition 1965, 4, :o2, 58533155, 24
44
+ tz.transition 1965, 9, :o1, 4878067, 2
45
+ tz.transition 1966, 4, :o2, 58541915, 24
46
+ tz.transition 1966, 10, :o1, 4878799, 2
47
+ tz.transition 1967, 4, :o2, 58550675, 24
48
+ tz.transition 1967, 10, :o1, 4879529, 2
49
+ tz.transition 1968, 4, :o2, 58559459, 24
50
+ tz.transition 1968, 10, :o1, 4880261, 2
51
+ tz.transition 1969, 4, :o2, 58568219, 24
52
+ tz.transition 1969, 10, :o1, 4880991, 2
53
+ tz.transition 1970, 4, :o2, 10364400
54
+ tz.transition 1970, 10, :o1, 23587200
55
+ tz.transition 1971, 4, :o2, 41900400
56
+ tz.transition 1971, 10, :o1, 55123200
57
+ tz.transition 1972, 4, :o2, 73522800
58
+ tz.transition 1972, 10, :o1, 86745600
59
+ tz.transition 1973, 4, :o2, 105058800
60
+ tz.transition 1973, 10, :o1, 118281600
61
+ tz.transition 1974, 4, :o2, 136594800
62
+ tz.transition 1974, 10, :o1, 149817600
63
+ tz.transition 1975, 4, :o2, 168130800
64
+ tz.transition 1975, 10, :o1, 181353600
65
+ tz.transition 1976, 4, :o2, 199753200
66
+ tz.transition 1976, 10, :o1, 212976000
67
+ tz.transition 1977, 4, :o2, 231289200
68
+ tz.transition 1977, 10, :o1, 244512000
69
+ tz.transition 1978, 4, :o2, 262825200
70
+ tz.transition 1978, 10, :o1, 276048000
71
+ tz.transition 1979, 4, :o2, 294361200
72
+ tz.transition 1979, 10, :o1, 307584000
73
+ tz.transition 1980, 4, :o2, 325983600
74
+ tz.transition 1980, 10, :o1, 339206400
75
+ tz.transition 1981, 4, :o2, 357519600
76
+ tz.transition 1981, 10, :o1, 370742400
77
+ tz.transition 1982, 7, :o2, 396399600
78
+ tz.transition 1982, 10, :o1, 402278400
79
+ tz.transition 1983, 7, :o2, 426812400
80
+ tz.transition 1983, 10, :o1, 433814400
81
+ tz.transition 1984, 4, :o2, 452214000
82
+ tz.transition 1984, 10, :o1, 465436800
83
+ tz.transition 1985, 4, :o2, 483750000
84
+ tz.transition 1985, 10, :o1, 496972800
85
+ tz.transition 1986, 4, :o2, 515286000
86
+ tz.transition 1986, 10, :o1, 528508800
87
+ tz.transition 1987, 4, :o2, 546822000
88
+ tz.transition 1987, 10, :o1, 560044800
89
+ tz.transition 1988, 4, :o2, 578444400
90
+ tz.transition 1988, 10, :o1, 591667200
91
+ tz.transition 1989, 5, :o2, 610412400
92
+ tz.transition 1989, 10, :o1, 623203200
93
+ tz.transition 1990, 4, :o2, 641516400
94
+ tz.transition 1990, 10, :o1, 654739200
95
+ tz.transition 1991, 4, :o2, 673052400
96
+ tz.transition 1991, 10, :o1, 686275200
97
+ tz.transition 1992, 4, :o2, 704674800
98
+ tz.transition 1992, 10, :o1, 717897600
99
+ tz.transition 1993, 4, :o2, 736210800
100
+ tz.transition 1993, 10, :o1, 749433600
101
+ tz.transition 1994, 4, :o2, 767746800
102
+ tz.transition 1994, 10, :o1, 780969600
103
+ tz.transition 1995, 4, :o2, 799020000
104
+ tz.transition 1995, 9, :o1, 812322000
105
+ tz.transition 1996, 4, :o2, 830469600
106
+ tz.transition 1996, 9, :o1, 843771600
107
+ tz.transition 1997, 4, :o2, 861919200
108
+ tz.transition 1997, 9, :o1, 875221200
109
+ tz.transition 1998, 4, :o2, 893368800
110
+ tz.transition 1998, 9, :o1, 906670800
111
+ tz.transition 1999, 4, :o2, 925423200
112
+ tz.transition 1999, 9, :o1, 938725200
113
+ tz.transition 2000, 4, :o2, 956872800
114
+ tz.transition 2000, 9, :o1, 970174800
115
+ tz.transition 2001, 4, :o2, 988322400
116
+ tz.transition 2001, 9, :o1, 1001624400
117
+ tz.transition 2002, 4, :o2, 1019772000
118
+ tz.transition 2002, 9, :o1, 1033074000
119
+ tz.transition 2003, 4, :o2, 1051221600
120
+ tz.transition 2003, 9, :o1, 1064523600
121
+ tz.transition 2004, 4, :o2, 1083276000
122
+ tz.transition 2004, 9, :o1, 1096578000
123
+ tz.transition 2005, 4, :o2, 1114725600
124
+ tz.transition 2005, 9, :o1, 1128027600
125
+ tz.transition 2006, 4, :o2, 1146175200
126
+ tz.transition 2006, 9, :o1, 1158872400
127
+ tz.transition 2007, 4, :o2, 1177624800
128
+ tz.transition 2007, 9, :o1, 1189112400
129
+ tz.transition 2008, 4, :o2, 1209074400
130
+ tz.transition 2008, 8, :o1, 1219957200
131
+ tz.transition 2009, 4, :o2, 1240524000
132
+ tz.transition 2009, 8, :o1, 1250802000
133
+ tz.transition 2010, 4, :o2, 1272578400
134
+ tz.transition 2010, 9, :o1, 1285880400
135
+ tz.transition 2011, 4, :o2, 1304028000
136
+ tz.transition 2011, 9, :o1, 1317330000
137
+ tz.transition 2012, 4, :o2, 1335477600
138
+ tz.transition 2012, 9, :o1, 1348779600
139
+ tz.transition 2013, 4, :o2, 1366927200
140
+ tz.transition 2013, 9, :o1, 1380229200
141
+ tz.transition 2014, 4, :o2, 1398376800
142
+ tz.transition 2014, 9, :o1, 1411678800
143
+ tz.transition 2015, 4, :o2, 1429826400
144
+ tz.transition 2015, 9, :o1, 1443128400
145
+ tz.transition 2016, 4, :o2, 1461880800
146
+ tz.transition 2016, 9, :o1, 1475182800
147
+ tz.transition 2017, 4, :o2, 1493330400
148
+ tz.transition 2017, 9, :o1, 1506632400
149
+ tz.transition 2018, 4, :o2, 1524780000
150
+ tz.transition 2018, 9, :o1, 1538082000
151
+ tz.transition 2019, 4, :o2, 1556229600
152
+ tz.transition 2019, 9, :o1, 1569531600
153
+ tz.transition 2020, 4, :o2, 1587679200
154
+ tz.transition 2020, 9, :o1, 1600981200
155
+ tz.transition 2021, 4, :o2, 1619733600
156
+ tz.transition 2021, 9, :o1, 1633035600
157
+ tz.transition 2022, 4, :o2, 1651183200
158
+ tz.transition 2022, 9, :o1, 1664485200
159
+ tz.transition 2023, 4, :o2, 1682632800
160
+ tz.transition 2023, 9, :o1, 1695934800
161
+ tz.transition 2024, 4, :o2, 1714082400
162
+ tz.transition 2024, 9, :o1, 1727384400
163
+ tz.transition 2025, 4, :o2, 1745532000
164
+ tz.transition 2025, 9, :o1, 1758834000
165
+ tz.transition 2026, 4, :o2, 1776981600
166
+ tz.transition 2026, 9, :o1, 1790283600
167
+ tz.transition 2027, 4, :o2, 1809036000
168
+ tz.transition 2027, 9, :o1, 1822338000
169
+ tz.transition 2028, 4, :o2, 1840485600
170
+ tz.transition 2028, 9, :o1, 1853787600
171
+ tz.transition 2029, 4, :o2, 1871935200
172
+ tz.transition 2029, 9, :o1, 1885237200
173
+ tz.transition 2030, 4, :o2, 1903384800
174
+ tz.transition 2030, 9, :o1, 1916686800
175
+ tz.transition 2031, 4, :o2, 1934834400
176
+ tz.transition 2031, 9, :o1, 1948136400
177
+ tz.transition 2032, 4, :o2, 1966888800
178
+ tz.transition 2032, 9, :o1, 1980190800
179
+ tz.transition 2033, 4, :o2, 1998338400
180
+ tz.transition 2033, 9, :o1, 2011640400
181
+ tz.transition 2034, 4, :o2, 2029788000
182
+ tz.transition 2034, 9, :o1, 2043090000
183
+ tz.transition 2035, 4, :o2, 2061237600
184
+ tz.transition 2035, 9, :o1, 2074539600
185
+ tz.transition 2036, 4, :o2, 2092687200
186
+ tz.transition 2036, 9, :o1, 2105989200
187
+ tz.transition 2037, 4, :o2, 2124136800
188
+ tz.transition 2037, 9, :o1, 2137438800
189
+ tz.transition 2038, 4, :o2, 29586521, 12
190
+ tz.transition 2038, 9, :o1, 19725579, 8
191
+ tz.transition 2039, 4, :o2, 29590889, 12
192
+ tz.transition 2039, 9, :o1, 19728491, 8
193
+ tz.transition 2040, 4, :o2, 29595257, 12
194
+ tz.transition 2040, 9, :o1, 19731403, 8
195
+ tz.transition 2041, 4, :o2, 29599625, 12
196
+ tz.transition 2041, 9, :o1, 19734315, 8
197
+ tz.transition 2042, 4, :o2, 29603993, 12
198
+ tz.transition 2042, 9, :o1, 19737227, 8
199
+ tz.transition 2043, 4, :o2, 29608361, 12
200
+ tz.transition 2043, 9, :o1, 19740139, 8
201
+ tz.transition 2044, 4, :o2, 29612813, 12
202
+ tz.transition 2044, 9, :o1, 19743107, 8
203
+ tz.transition 2045, 4, :o2, 29617181, 12
204
+ tz.transition 2045, 9, :o1, 19746019, 8
205
+ tz.transition 2046, 4, :o2, 29621549, 12
206
+ tz.transition 2046, 9, :o1, 19748931, 8
207
+ tz.transition 2047, 4, :o2, 29625917, 12
208
+ tz.transition 2047, 9, :o1, 19751843, 8
209
+ tz.transition 2048, 4, :o2, 29630285, 12
210
+ tz.transition 2048, 9, :o1, 19754755, 8
211
+ tz.transition 2049, 4, :o2, 29634737, 12
212
+ tz.transition 2049, 9, :o1, 19757723, 8
213
+ tz.transition 2050, 4, :o2, 29639105, 12
214
+ tz.transition 2050, 9, :o1, 19760635, 8
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end