when_exe 0.4.1 → 0.4.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.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -33
  3. data/bin/locales.rb +1 -1
  4. data/bin/make_ttl.rb.config +1 -1
  5. data/lib/when_exe.rb +27 -16
  6. data/lib/when_exe/basictypes.rb +772 -771
  7. data/lib/when_exe/calendartypes.rb +1485 -1453
  8. data/lib/when_exe/coordinates.rb +5 -0
  9. data/lib/when_exe/core/compatibility.rb +1 -1
  10. data/lib/when_exe/core/duration.rb +147 -116
  11. data/lib/when_exe/core/extension.rb +499 -497
  12. data/lib/when_exe/ephemeris.rb +1952 -1951
  13. data/lib/when_exe/ephemeris/eclipse.rb +5 -4
  14. data/lib/when_exe/ephemeris/notes.rb +457 -421
  15. data/lib/when_exe/ephemeris/planets.rb +585 -585
  16. data/lib/when_exe/ephemeris/sun.rb +214 -214
  17. data/lib/when_exe/google_api.rb +153 -0
  18. data/lib/when_exe/icalendar.rb +1640 -1632
  19. data/lib/when_exe/inspect.rb +42 -20
  20. data/lib/when_exe/linkeddata.rb +28 -7
  21. data/lib/when_exe/locales/autoload.rb +2 -1
  22. data/lib/when_exe/locales/locale.rb +35 -15
  23. data/lib/when_exe/locales/zh.rb +77 -0
  24. data/lib/when_exe/mini_application.rb +3 -1
  25. data/lib/when_exe/{googlecalendar.rb → obsolete/googlecalendar.rb} +144 -144
  26. data/lib/when_exe/parts/enumerator.rb +498 -486
  27. data/lib/when_exe/parts/geometric_complex.rb +397 -397
  28. data/lib/when_exe/parts/timezone.rb +246 -241
  29. data/lib/when_exe/region/armenian.rb +55 -56
  30. data/lib/when_exe/region/babylonian.rb +406 -405
  31. data/lib/when_exe/region/bahai.rb +107 -106
  32. data/lib/when_exe/region/balinese.rb +624 -622
  33. data/lib/when_exe/region/chinese.rb +1071 -1026
  34. data/lib/when_exe/region/chinese/epochs.rb +28 -28
  35. data/lib/when_exe/region/chinese/notes.rb +219 -0
  36. data/lib/when_exe/region/chinese/twins.rb +803 -803
  37. data/lib/when_exe/region/christian.rb +21 -15
  38. data/lib/when_exe/region/coptic.rb +107 -106
  39. data/lib/when_exe/region/discordian.rb +218 -218
  40. data/lib/when_exe/region/east_asian.rb +1 -1
  41. data/lib/when_exe/region/french.rb +126 -56
  42. data/lib/when_exe/region/geologicalage.rb +639 -639
  43. data/lib/when_exe/region/goddess.rb +60 -58
  44. data/lib/when_exe/region/hanke_henry.rb +2 -2
  45. data/lib/when_exe/region/indian.rb +1225 -1222
  46. data/lib/when_exe/region/international_fixed.rb +96 -97
  47. data/lib/when_exe/region/iranian.rb +206 -203
  48. data/lib/when_exe/region/islamic.rb +102 -102
  49. data/lib/when_exe/region/japanese.rb +126 -71
  50. data/lib/when_exe/region/japanese/epochs.rb +426 -426
  51. data/lib/when_exe/region/japanese/notes.rb +101 -81
  52. data/lib/when_exe/region/japanese/residues.rb +1345 -1311
  53. data/lib/when_exe/region/japanese/twins.rb +225 -225
  54. data/lib/when_exe/region/japanese/weeks.rb +112 -112
  55. data/lib/when_exe/region/javanese.rb +230 -230
  56. data/lib/when_exe/region/jewish.rb +130 -131
  57. data/lib/when_exe/region/m17n.rb +114 -114
  58. data/lib/when_exe/region/martian.rb +258 -258
  59. data/lib/when_exe/region/mayan.rb +11 -8
  60. data/lib/when_exe/region/pax.rb +4 -5
  61. data/lib/when_exe/region/pope.rb +1 -1
  62. data/lib/when_exe/region/positivist.rb +100 -100
  63. data/lib/when_exe/region/residue.rb +162 -162
  64. data/lib/when_exe/region/roman.rb +333 -333
  65. data/lib/when_exe/region/{soviet.rb → russian.rb} +221 -209
  66. data/lib/when_exe/region/shire.rb +222 -223
  67. data/lib/when_exe/region/symmetry.rb +50 -50
  68. data/lib/when_exe/region/thai.rb +336 -336
  69. data/lib/when_exe/region/tibetan.rb +315 -316
  70. data/lib/when_exe/region/tranquility.rb +207 -208
  71. data/lib/when_exe/region/vanishing_leprechaun.rb +3 -1
  72. data/lib/when_exe/region/vietnamese.rb +449 -440
  73. data/lib/when_exe/region/weekdate.rb +80 -80
  74. data/lib/when_exe/region/world.rb +170 -171
  75. data/lib/when_exe/region/world_season.rb +89 -89
  76. data/lib/when_exe/region/yerm.rb +3 -3
  77. data/lib/when_exe/region/zoroastrian.rb +205 -205
  78. data/lib/when_exe/timestandard.rb +708 -707
  79. data/lib/when_exe/tmduration.rb +338 -338
  80. data/lib/when_exe/tmobjects.rb +1356 -1356
  81. data/lib/when_exe/tmposition.rb +66 -31
  82. data/lib/when_exe/version.rb +16 -2
  83. data/test/examples/Residue.m17n +83 -83
  84. data/test/examples/Terms.m17n +2 -2
  85. data/test/test.rb +2 -2
  86. data/test/test/google_api.rb +65 -0
  87. data/test/test/linkeddata.rb +1 -1
  88. data/test/test/{googlecalendar.rb → obsolete/googlecalendar.rb} +194 -194
  89. data/test/test/region/indian.rb +90 -85
  90. data/test/test/region/m17n.rb +7 -7
  91. data/test/test/region/mayan.rb +195 -195
  92. data/test/test/region/residue.rb +153 -153
  93. data/test/test/tmposition.rb +11 -1
  94. data/when_exe.gemspec +2 -2
  95. metadata +95 -8
  96. data/test/test.rb.config +0 -1
@@ -1,241 +1,246 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 2011-2014 Takashi SUGA
4
-
5
- You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
- =end
7
-
8
- #
9
- # 本ライブラリのための諸々の部品
10
- #
11
- module When::Parts
12
-
13
- #
14
- # TZInfo::Timezone クラスを本ライブラリから使用するためのラッパークラス
15
- #
16
- class Timezone
17
-
18
- #
19
- # When::V::Timezone と Qhwn::Parts::Timezone の抽象基底
20
- #
21
- module Base
22
- # 標準時間帯の時計
23
- # @return [When::TM::Clock]
24
- attr_reader :standard
25
-
26
- # 夏時間帯の時計
27
- # @return [When::TM::Clock]
28
- attr_reader :daylight
29
-
30
- # 夏時間帯と標準時間帯の時間差
31
- # @return [When::TM:IntervalLength]
32
- attr_reader :tz_difference
33
-
34
- # When::TM::TemporalPosition の時間帯を変更して複製する
35
- #
36
- # @param [When::TM::CalDate, When::TM::DateAndTime, When::TM::JulianDate] date
37
- # @param [Hash] options see {When::TM::TemporalPosition._instance}
38
- #
39
- # @return [When::TM::DateAndTime, When::TM::JulianDate]
40
- #
41
- def ^(date, options={})
42
- date = When::TM::Position.any_other(date, options)
43
- options = date._attr.merge({:clock=>self}).merge(options)
44
- return When::TM::JulianDate.dynamical_time(date.dynamical_time, options) unless date.frame.kind_of?(When::TM::Calendar)
45
- date.frame.jul_trans(When::TM::JulianDate.dynamical_time(date.dynamical_time), options)
46
- end
47
- end
48
-
49
- class << self
50
- include Resource::Pool
51
-
52
- # @private
53
- alias :_get :[]
54
-
55
- # オブジェクト参照
56
- #
57
- # @param [String] label 識別名 ( "America/New_York" など)
58
- #
59
- # @return [When::Parts::Timezone] 時間帯オブジェクト
60
- #
61
- def [](label)
62
- ref = _get(label)
63
- return ref if ref
64
- return nil unless label =~ /\A[A-Z]/i
65
- self[label] = self.new(label)
66
- rescue NameError
67
- raise NameError, 'Prease install TZInfo - gem install tzinfo'
68
- end
69
- alias :get :[]
70
-
71
- # TZInfo でサポートしている Timezone の連想配列
72
- #
73
- # @return [Hash] { String => TZInfo::CountryTimezone }
74
- # [ String - 時間帯ID ]
75
- # [ TZInfo::CountryTimezone - 時間帯オブジェクト(proxy for autoload) ]
76
- #
77
- def tz_info
78
- return @tz_info if @tz_info
79
- zones = {}
80
- TZInfo::Country.all.each do |c|
81
- c.zone_info.each do |z|
82
- zones[z.identifier] ||= {}
83
- zones[z.identifier][c.code] = z
84
- end
85
- end
86
-
87
- @tz_info = {}
88
- zones.each_pair do |id, hash|
89
- if hash.keys.size == 1
90
- @tz_info[id] = hash[hash.keys[0]]
91
- else
92
- hash.each_pair do |c, z|
93
- @tz_info["#{id}(#{c})"] = z
94
- end
95
- end
96
- end
97
- @tz_info
98
- end
99
- end
100
-
101
- include Base
102
-
103
- # ラップしている TZInfo::Timezone インスタンス
104
- # @return [TZInfo::Timezone]
105
- attr_reader :timezone
106
-
107
- # ユニーク識別名
108
- # @return [String]
109
- attr_reader :identifier
110
- alias :label :identifier
111
- alias :inspect :identifier
112
-
113
- # 時間帯を代表する都市の経度 / 度
114
- # @return [Rational]
115
- def longitude
116
- self.class.tz_info[label].longitude
117
- end
118
-
119
- # 時間帯を代表する都市の緯度 / 度
120
- # @return [Rational]
121
- def latitude
122
- self.class.tz_info[label].latitude
123
- end
124
-
125
- # 時間帯を代表する都市の空間位置
126
- # @return [When::Coordinates::Spatial]
127
- def location
128
- return @location if @location
129
- tzinfo = self.class.tz_info[label]
130
- longitude = When::Coordinates.to_dms(tzinfo.longitude, 'EW')
131
- latitude = When::Coordinates.to_dms(tzinfo.latitude, 'NS')
132
- @location = When.Resource("_l:long=#{longitude}&lat=#{latitude}&label=#{label}")
133
- end
134
-
135
- # 時分秒のインデクス
136
- # @return [Array<When::Coordinates::Index>]
137
- attr_reader :indices
138
-
139
- # オブジェクト生成
140
- #
141
- # @param [String] identifier 識別名 ( "America/New_York" など)
142
- #
143
- def initialize(identifier)
144
- @identifier = identifier
145
- id, query = identifier.split('?', 2)
146
- @timezone = TZInfo::Timezone.get(id)
147
- unless TZInfo::TimeOrDateTime.method_defined?(:_to_datetime)
148
- if TZInfo::RubyCoreSupport.respond_to?(:datetime_new)
149
- TZInfo::TimeOrDateTime.class_eval %Q{
150
- alias :_to_datetime :to_datetime
151
- ::Rational
152
- def to_datetime
153
- unless @datetime
154
- u = usec
155
- s = u == 0 ? sec : Rational(sec * 1000000 + u, 1000000)
156
- @datetime = TZInfo::RubyCoreSupport.datetime_new(year, mon, mday, hour, min, s, 0, Date::GREGORIAN)
157
- end
158
- @datetime
159
- end
160
- }
161
- else
162
- TZInfo::TimeOrDateTime.class_eval %Q{
163
- alias :_to_datetime :to_datetime
164
- def to_datetime
165
- @datetime ||= DateTime.new(year, mon, mday, hour, min, sec, 0, Date::GREGORIAN)
166
- end
167
- }
168
- end
169
- end
170
- dst, std = _offsets(Time.now.to_i)
171
- options = query ? Hash[*(query.split('&').map {|item| item.split('=',2)}.flatten)] : {}
172
- @standard = When::TM::Clock.new(options.merge({:zone=>std, :tz_prop=>self}))
173
- if std == dst
174
- @daylight = @standard
175
- @tz_difference = 0
176
- else
177
- @daylight = When::TM::Clock.new(options.merge({:zone=>dst, :tz_prop=>self}))
178
- @tz_difference = @standard.universal_time - @daylight.universal_time
179
- end
180
- @indices = When::Coordinates::DefaultTimeIndices
181
- end
182
-
183
- # @private
184
- def _daylight(time)
185
- frame, cal_date, clk_time = time
186
- clocks = {}
187
- options = {}
188
- %w(border location).each do |attr|
189
- value = @standard.instance_variable_get("@#{attr}")
190
- next unless value
191
- value = value.dup unless value.kind_of?(When::Parts::Resource) && value.registered?
192
- options[attr] = value
193
- end
194
- if clk_time
195
- time = frame.to_universal_time(cal_date, clk_time, @standard)
196
- offsets = _offsets((time/When::TM::Duration::SECOND).floor)
197
- offsets.each do |offset|
198
- clocks[offset] ||= When::TM::Clock.new(options.merge({:zone=>offset, :tz_prop=>self}))
199
- return clocks[offsets[0]] if @timezone.period_for_utc(
200
- (frame.to_universal_time(cal_date, clk_time, clocks[offset])/When::TM::Duration::SECOND).floor).dst?
201
- end
202
- end
203
- offset = @timezone.period_for_utc((time/When::TM::Duration::SECOND).floor).utc_total_offset
204
- clocks[offset] || When::TM::Clock.new(options.merge({:zone=>offset, :tz_prop=>self}))
205
- end
206
-
207
- # @private
208
- def _need_validate
209
- true
210
- end
211
-
212
- private
213
-
214
- def _offsets(time)
215
- now = @timezone.period_for_utc(time)
216
- past = @timezone.period_for_utc(now.utc_start-1) if now.utc_start
217
- future = @timezone.period_for_utc(now.utc_end) if now.utc_end
218
- std = now.utc_offset
219
- dst = now.utc_total_offset
220
- [past, future].each do |period|
221
- next unless period
222
- std = period.utc_offset if std > period.utc_offset
223
- dst = period.utc_total_offset if dst < period.utc_total_offset
224
- end
225
- [dst, std]
226
- end
227
-
228
- # その他のメソッド
229
- # When::Parts::GeometricComplex で定義されていないメソッドは
230
- # 処理を first (type: When::TM::(Temporal)Position) に委譲する
231
- #
232
- def method_missing(name, *args, &block)
233
- self.class.module_eval %Q{
234
- def #{name}(*args, &block)
235
- timezone.send("#{name}", *args, &block)
236
- end
237
- } unless When::Parts::MethodCash.escape(name)
238
- timezone.send(name, *args, &block)
239
- end
240
- end
241
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2015 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ #
9
+ # 本ライブラリのための諸々の部品
10
+ #
11
+ module When::Parts
12
+
13
+ #
14
+ # TZInfo::Timezone クラスを本ライブラリから使用するためのラッパークラス
15
+ #
16
+ class Timezone
17
+
18
+ #
19
+ # When::V::Timezone と Qhwn::Parts::Timezone の抽象基底
20
+ #
21
+ module Base
22
+ # 標準時間帯の時計
23
+ # @return [When::TM::Clock]
24
+ attr_reader :standard
25
+
26
+ # 夏時間帯の時計
27
+ # @return [When::TM::Clock]
28
+ attr_reader :daylight
29
+
30
+ # 夏時間帯と標準時間帯の時間差
31
+ # @return [When::TM:IntervalLength]
32
+ attr_reader :tz_difference
33
+
34
+ # When::TM::TemporalPosition の時間帯を変更して複製する
35
+ #
36
+ # @param [When::TM::CalDate, When::TM::DateAndTime, When::TM::JulianDate] date
37
+ # @param [Hash] options see {When::TM::TemporalPosition._instance}
38
+ #
39
+ # @return [When::TM::DateAndTime, When::TM::JulianDate]
40
+ #
41
+ def ^(date, options={})
42
+ date = When::TM::Position.any_other(date, options)
43
+ options = date._attr.merge({:clock=>self}).merge(options)
44
+ return When::TM::JulianDate.dynamical_time(date.dynamical_time, options) unless date.frame.kind_of?(When::TM::Calendar)
45
+ date.frame.jul_trans(When::TM::JulianDate.dynamical_time(date.dynamical_time), options)
46
+ end
47
+ end
48
+
49
+ class << self
50
+ include Resource::Pool
51
+
52
+ # @private
53
+ alias :_get :[]
54
+
55
+ # オブジェクト参照
56
+ #
57
+ # @param [String] label 識別名 ( "America/New_York" など)
58
+ #
59
+ # @return [When::Parts::Timezone] 時間帯オブジェクト
60
+ #
61
+ def [](label)
62
+ ref = _get(label)
63
+ return ref if ref
64
+ return nil unless label =~ /\A[A-Z]/i
65
+ self[label] = self.new(label)
66
+ rescue NameError
67
+ raise NameError, 'Prease install TZInfo - gem install tzinfo'
68
+ end
69
+ alias :get :[]
70
+
71
+ # TZInfo でサポートしている Timezone の連想配列
72
+ #
73
+ # @return [Hash] { String => TZInfo::CountryTimezone }
74
+ # [ String - 時間帯ID ]
75
+ # [ TZInfo::CountryTimezone - 時間帯オブジェクト(proxy for autoload) ]
76
+ #
77
+ def tz_info
78
+ return @tz_info if @tz_info
79
+ zones = {}
80
+ TZInfo::Country.all.each do |c|
81
+ c.zone_info.each do |z|
82
+ zones[z.identifier] ||= {}
83
+ zones[z.identifier][c.code] = z
84
+ end
85
+ end
86
+
87
+ @tz_info = {}
88
+ zones.each_pair do |id, hash|
89
+ @tz_info[id] = hash[hash.keys[0]]
90
+ unless hash.keys.size == 1
91
+ hash.each_pair do |c, z|
92
+ @tz_info["#{id}(#{c})"] = z
93
+ end
94
+ end
95
+ end
96
+ @tz_info
97
+ end
98
+ end
99
+
100
+ include Base
101
+
102
+ # ラップしている TZInfo::Timezone インスタンス
103
+ # @return [TZInfo::Timezone]
104
+ attr_reader :timezone
105
+
106
+ # ユニーク識別名
107
+ # @return [String]
108
+ attr_reader :identifier
109
+ alias :label :identifier
110
+ alias :inspect :identifier
111
+
112
+ # 時間帯を代表する都市の経度 / 度
113
+ # @return [Rational]
114
+ def longitude
115
+ self.class.tz_info[label].longitude
116
+ end
117
+
118
+ # 時間帯を代表する都市の緯度 / 度
119
+ # @return [Rational]
120
+ def latitude
121
+ self.class.tz_info[label].latitude
122
+ end
123
+
124
+ # 時間帯を代表する都市の空間位置
125
+ # @return [When::Coordinates::Spatial]
126
+ def location
127
+ return @location if @location
128
+ city_tz = @timezone
129
+ unless self.class.tz_info[label]
130
+ while city_tz.kind_of?(TZInfo::LinkedTimezone)
131
+ city_tz = TZInfo::Timezone.get(city_tz.send(:info).link_to_identifier)
132
+ end
133
+ end
134
+ tzinfo = self.class.tz_info[city_tz.identifier]
135
+ longitude = When::Coordinates.to_dms(tzinfo.longitude, 'EW')
136
+ latitude = When::Coordinates.to_dms(tzinfo.latitude, 'NS')
137
+ @location = When.Resource("_l:long=#{longitude}&lat=#{latitude}&label=#{label}")
138
+ end
139
+
140
+ # 時分秒のインデクス
141
+ # @return [Array<When::Coordinates::Index>]
142
+ attr_reader :indices
143
+
144
+ # オブジェクト生成
145
+ #
146
+ # @param [String] identifier 識別名 ( "America/New_York" など)
147
+ #
148
+ def initialize(identifier)
149
+ @identifier = identifier
150
+ id, query = identifier.split('?', 2)
151
+ @timezone = TZInfo::Timezone.get(id.sub(/\(.+?\)\z/,''))
152
+ unless TZInfo::TimeOrDateTime.method_defined?(:_to_datetime)
153
+ if TZInfo::RubyCoreSupport.respond_to?(:datetime_new)
154
+ TZInfo::TimeOrDateTime.class_eval %Q{
155
+ alias :_to_datetime :to_datetime
156
+ ::Rational
157
+ def to_datetime
158
+ unless @datetime
159
+ u = usec
160
+ s = u == 0 ? sec : Rational(sec * 1000000 + u, 1000000)
161
+ @datetime = TZInfo::RubyCoreSupport.datetime_new(year, mon, mday, hour, min, s, 0, Date::GREGORIAN)
162
+ end
163
+ @datetime
164
+ end
165
+ }
166
+ else
167
+ TZInfo::TimeOrDateTime.class_eval %Q{
168
+ alias :_to_datetime :to_datetime
169
+ def to_datetime
170
+ @datetime ||= DateTime.new(year, mon, mday, hour, min, sec, 0, Date::GREGORIAN)
171
+ end
172
+ }
173
+ end
174
+ end
175
+ dst, std = _offsets(Time.now.to_i)
176
+ options = query ? Hash[*(query.split('&').map {|item| item.split('=',2)}.flatten)] : {}
177
+ @standard = When::TM::Clock.new(options.merge({:zone=>std, :tz_prop=>self}))
178
+ if std == dst
179
+ @daylight = @standard
180
+ @tz_difference = 0
181
+ else
182
+ @daylight = When::TM::Clock.new(options.merge({:zone=>dst, :tz_prop=>self}))
183
+ @tz_difference = @standard.universal_time - @daylight.universal_time
184
+ end
185
+ @indices = When::Coordinates::DefaultTimeIndices
186
+ end
187
+
188
+ # @private
189
+ def _daylight(time)
190
+ frame, cal_date, clk_time = time
191
+ clocks = {}
192
+ options = {}
193
+ %w(border location).each do |attr|
194
+ value = @standard.instance_variable_get("@#{attr}")
195
+ next unless value
196
+ value = value.dup unless value.kind_of?(When::Parts::Resource) && value.registered?
197
+ options[attr] = value
198
+ end
199
+ if clk_time
200
+ time = frame.to_universal_time(cal_date, clk_time, @standard)
201
+ offsets = _offsets((time/When::TM::Duration::SECOND).floor)
202
+ offsets.each do |offset|
203
+ clocks[offset] ||= When::TM::Clock.new(options.merge({:zone=>offset, :tz_prop=>self}))
204
+ return clocks[offsets[0]] if @timezone.period_for_utc(
205
+ (frame.to_universal_time(cal_date, clk_time, clocks[offset])/When::TM::Duration::SECOND).floor).dst?
206
+ end
207
+ end
208
+ offset = @timezone.period_for_utc((time/When::TM::Duration::SECOND).floor).utc_total_offset
209
+ clocks[offset] || When::TM::Clock.new(options.merge({:zone=>offset, :tz_prop=>self}))
210
+ end
211
+
212
+ # @private
213
+ def _need_validate
214
+ true
215
+ end
216
+
217
+ private
218
+
219
+ def _offsets(time)
220
+ now = @timezone.period_for_utc(time)
221
+ past = @timezone.period_for_utc(now.utc_start-1) if now.utc_start
222
+ future = @timezone.period_for_utc(now.utc_end) if now.utc_end
223
+ std = now.utc_offset
224
+ dst = now.utc_total_offset
225
+ [past, future].each do |period|
226
+ next unless period
227
+ std = period.utc_offset if std > period.utc_offset
228
+ dst = period.utc_total_offset if dst < period.utc_total_offset
229
+ end
230
+ [dst, std]
231
+ end
232
+
233
+ # その他のメソッド
234
+ # When::Parts::GeometricComplex で定義されていないメソッドは
235
+ # 処理を first (type: When::TM::(Temporal)Position) に委譲する
236
+ #
237
+ def method_missing(name, *args, &block)
238
+ self.class.module_eval %Q{
239
+ def #{name}(*args, &block)
240
+ timezone.send("#{name}", *args, &block)
241
+ end
242
+ } unless When::Parts::MethodCash.escape(name)
243
+ timezone.send(name, *args, &block)
244
+ end
245
+ end
246
+ end