when_exe 0.3.6 → 0.3.7

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 (117) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +171 -0
  3. data/lib/when_exe.rb +78 -47
  4. data/lib/when_exe/basictypes.rb +752 -747
  5. data/lib/when_exe/calendarnote.rb +805 -801
  6. data/lib/when_exe/calendartypes.rb +1583 -1531
  7. data/lib/when_exe/coordinates.rb +16 -15
  8. data/lib/when_exe/core/duration.rb +114 -110
  9. data/lib/when_exe/core/extension.rb +504 -504
  10. data/lib/when_exe/ephemeris.rb +1917 -1913
  11. data/lib/when_exe/ephemeris/moon.rb +333 -333
  12. data/lib/when_exe/ephemeris/notes.rb +389 -387
  13. data/lib/when_exe/ephemeris/planets.rb +585 -585
  14. data/lib/when_exe/ephemeris/sun.rb +214 -214
  15. data/lib/when_exe/googlecalendar.rb +144 -140
  16. data/lib/when_exe/icalendar.rb +1636 -1636
  17. data/lib/when_exe/inspect.rb +46 -22
  18. data/lib/when_exe/locales/akt.rb +176 -176
  19. data/lib/when_exe/locales/encoding_conversion.rb +134 -126
  20. data/lib/when_exe/locales/iast.rb +90 -90
  21. data/lib/when_exe/locales/locale.rb +750 -746
  22. data/lib/when_exe/locales/transliteration_table.rb +62 -62
  23. data/lib/when_exe/mini_application.rb +307 -305
  24. data/lib/when_exe/parts/enumerator.rb +2 -2
  25. data/lib/when_exe/parts/geometric_complex.rb +397 -397
  26. data/lib/when_exe/parts/method_cash.rb +224 -224
  27. data/lib/when_exe/parts/resource.rb +1069 -1071
  28. data/lib/when_exe/parts/timezone.rb +240 -230
  29. data/lib/when_exe/region/armenian.rb +56 -56
  30. data/lib/when_exe/region/babylonian.rb +405 -0
  31. data/lib/when_exe/region/bahai.rb +146 -146
  32. data/lib/when_exe/region/balinese.rb +622 -622
  33. data/lib/when_exe/region/chinese.rb +95 -25
  34. data/lib/when_exe/region/chinese/calendars.rb +1016 -1016
  35. data/lib/when_exe/region/chinese/epochs.rb +1 -1
  36. data/lib/when_exe/region/chinese/twins.rb +803 -795
  37. data/lib/when_exe/region/christian.rb +824 -824
  38. data/lib/when_exe/region/coptic.rb +106 -87
  39. data/lib/when_exe/region/discordian.rb +225 -225
  40. data/lib/when_exe/region/far_east.rb +188 -188
  41. data/lib/when_exe/region/french.rb +56 -56
  42. data/lib/when_exe/region/geologicalage.rb +639 -639
  43. data/lib/when_exe/region/goddess.rb +58 -58
  44. data/lib/when_exe/region/indian.rb +1254 -1251
  45. data/lib/when_exe/region/iranian.rb +8 -8
  46. data/lib/when_exe/region/islamic.rb +3 -3
  47. data/lib/when_exe/region/japanese.rb +93 -99
  48. data/lib/when_exe/region/japanese/calendars.rb +396 -397
  49. data/lib/when_exe/region/japanese/epochs.rb +26 -26
  50. data/lib/when_exe/region/japanese/nihon_shoki.rb +71 -71
  51. data/lib/when_exe/region/japanese/notes.rb +1383 -1386
  52. data/lib/when_exe/region/japanese/residues.rb +1306 -1306
  53. data/lib/when_exe/region/japanese/twins.rb +225 -225
  54. data/lib/when_exe/region/japanese/weeks.rb +112 -0
  55. data/lib/when_exe/region/javanese.rb +230 -230
  56. data/lib/when_exe/region/jewish.rb +126 -126
  57. data/lib/when_exe/region/korean.rb +378 -378
  58. data/lib/when_exe/region/m17n.rb +114 -113
  59. data/lib/when_exe/region/martian.rb +258 -255
  60. data/lib/when_exe/region/mayan.rb +32 -32
  61. data/lib/when_exe/region/residue.rb +89 -89
  62. data/lib/when_exe/region/roman.rb +36 -24
  63. data/lib/when_exe/region/ryukyu.rb +97 -97
  64. data/lib/when_exe/region/shire.rb +240 -240
  65. data/lib/when_exe/region/soviet.rb +209 -0
  66. data/lib/when_exe/region/symmetry.rb +50 -50
  67. data/lib/when_exe/region/thai.rb +336 -335
  68. data/lib/when_exe/region/tibetan.rb +316 -315
  69. data/lib/when_exe/region/vietnamese.rb +440 -439
  70. data/lib/when_exe/region/weekdate.rb +80 -80
  71. data/lib/when_exe/region/world.rb +175 -175
  72. data/lib/when_exe/region/yerm.rb +14 -14
  73. data/lib/when_exe/region/zoroastrian.rb +203 -203
  74. data/lib/when_exe/timestandard.rb +707 -681
  75. data/lib/when_exe/tmduration.rb +338 -330
  76. data/lib/when_exe/tmobjects.rb +1346 -1325
  77. data/lib/when_exe/tmposition.rb +2115 -2072
  78. data/lib/when_exe/tmreference.rb +1693 -1669
  79. data/lib/when_exe/version.rb +1 -1
  80. data/link_to_online_documents +1 -1
  81. data/test/examples/JapanHolidaysRFC6350.ics +1 -1
  82. data/test/test.rb +67 -61
  83. data/test/test/basictypes.rb +409 -409
  84. data/test/test/calendarnote.rb +86 -69
  85. data/test/test/calendartypes.rb +97 -97
  86. data/test/test/coordinates.rb +396 -396
  87. data/test/test/ephemeris.rb +83 -74
  88. data/test/test/ephemeris/moon.rb +14 -14
  89. data/test/test/ephemeris/planets.rb +14 -14
  90. data/test/test/ephemeris/sun.rb +14 -14
  91. data/test/test/googlecalendar.rb +194 -176
  92. data/test/test/icalendar.rb +867 -858
  93. data/test/test/inspect.rb +117 -117
  94. data/test/test/parts.rb +487 -487
  95. data/test/test/region/balinese.rb +34 -0
  96. data/test/test/region/chinese.rb +218 -206
  97. data/test/test/region/christian.rb +245 -245
  98. data/test/test/region/coptic.rb +27 -27
  99. data/test/test/region/french.rb +33 -33
  100. data/test/test/region/geologicalage.rb +17 -17
  101. data/test/test/region/indian.rb +57 -57
  102. data/test/test/region/iran.rb +54 -54
  103. data/test/test/region/islamic.rb +18 -18
  104. data/test/test/region/japanese.rb +237 -219
  105. data/test/test/region/jewish.rb +61 -61
  106. data/test/test/region/m17n.rb +184 -184
  107. data/test/test/region/mayan.rb +195 -195
  108. data/test/test/region/residue.rb +147 -139
  109. data/test/test/region/thai.rb +116 -116
  110. data/test/test/region/tibetan.rb +30 -30
  111. data/test/test/region/vietnamese.rb +102 -102
  112. data/test/test/region/yerm.rb +146 -146
  113. data/test/test/timestandard.rb +81 -81
  114. data/test/test/tmobjects.rb +328 -328
  115. data/test/test/tmposition.rb +397 -284
  116. data/test/test/tmreference.rb +157 -157
  117. metadata +13 -10
@@ -1,330 +1,338 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Minimum subset - A multicultural and multilingualized calendar library based on ISO 8601, ISO 19108 and RFC 5545
4
-
5
- Copyright (C) 2013 Takashi SUGA
6
-
7
- You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
8
-
9
- =end
10
-
11
- module When
12
-
13
- # 分解能定数
14
-
15
- CENTURY = -4
16
- DECADE = -3
17
- YEAR = -2
18
- MONTH = -1
19
- WEEK = -0.5
20
- DAY = 0
21
- HOUR = 1
22
- MINUTE = 2
23
- SECOND = 3
24
- STRING = 5
25
- SYSTEM = (Float::MANT_DIG*0.3).to_i
26
-
27
- #
28
- # (5.2) Temporal Objects Package
29
- #
30
- #
31
- module TM
32
-
33
- # 時間次元における長さ又は距離を記述するために使うデータ型
34
- #
35
- # see {gml schema}[link:http://schemas.opengis.net/gml/3.1.1/base/temporal.xsd#duration]
36
- #
37
- class Duration
38
-
39
- # 物理的な時間間隔の定数
40
- #
41
- # 時間の「秒」を Float で表現して丸め誤差が発生しない範囲で、
42
- # もっとも大きな時間間隔(86400s を 2 の因数で割りつくした値)
43
- # を単位 SYSTEM とする
44
- #
45
- SYSTEM = 1.0
46
- DAY = SYSTEM * 675
47
- YEAR = DAY * 365.2425
48
- MONTH = YEAR / 12
49
- WEEK = DAY * 7
50
- HOUR = DAY / 24
51
- MINUTE = HOUR / 60
52
- SECOND = MINUTE / 60
53
-
54
- UnitName = {YEAR=>'year', MONTH =>'month', WEEK =>'week', DAY =>'day',
55
- HOUR=>'hour', MINUTE=>'minute', SECOND=>'second', SYSTEM=>'system'}
56
- Unit = UnitName.invert
57
- DurationUnits = [DAY, HOUR, MINUTE, SECOND]
58
-
59
- #
60
- # オブジェクト生成用クラスメソッド
61
- #
62
- class << self
63
- #
64
- # 日時分秒からのオブジェクト生成
65
- #
66
- # @param [Array<Numeric>] value ( 日, 時, 分, 秒 ) 下位の桁は省略可
67
- #
68
- # @return [When::TM::Duration]
69
- #
70
- def dhms(*value)
71
- units = DurationUnits.dup
72
- Duration.new(value.inject(0) {|s,v| s + v * units.shift})
73
- end
74
-
75
- #
76
- # メソッド名に相当する単位で表した value に対応する When::TM::Duration を生成する
77
- # @method unit
78
- # @param [Numeric] value
79
- # @return [When::TM::Duration]
80
- # @note unit は second, minute, hour, day, week に読み替える
81
-
82
- # @private
83
- Unit.keys.each do |key|
84
- module_eval %Q{
85
- def #{key}(value)
86
- new(value * Unit['#{key}'])
87
- end
88
- }
89
- end
90
- end
91
-
92
- # 時間間隔の長さ (128秒単位)
93
- #
94
- # @return [Numeric]
95
- #
96
- attr_accessor :duration
97
-
98
- #
99
- # メソッド名に相当する単位で表した時間間隔の大きさ
100
- # @method unit
101
- # @return [Numeric]
102
- # @note unit は second, minute, hour, day, week に読み替える
103
-
104
- # @private
105
- Unit.keys.each do |key|
106
- module_eval %Q{
107
- def #{key}
108
- duration / Unit['#{key}']
109
- end
110
- }
111
- end
112
-
113
- # 時間間隔の長さ / 秒
114
- #
115
- # @return [Float]
116
- #
117
- def to_f
118
- duration / SECOND
119
- end
120
- alias :to_float :to_f
121
-
122
- # 時間間隔の長さ / 秒
123
- #
124
- # @return [Integer] (四捨五入値)
125
- #
126
- def to_i
127
- to_f.round
128
- end
129
- alias :to_int :to_i
130
-
131
- # 符号反転
132
- #
133
- # @return [When::TM::Duration]
134
- #
135
- def -@
136
- Duration.new(-@duration)
137
- end
138
-
139
- # 絶対値
140
- #
141
- # @return [When::TM::Duration]
142
- #
143
- def abs
144
- sign >= 0 ? self.dup : -self
145
- end
146
-
147
- # 符号
148
- #
149
- # @return [Integer] 0 との比較により、負,0,正の値を返す
150
- #
151
- def sign
152
- @duration <=> 0
153
- end
154
-
155
- # 比較
156
- #
157
- # @param [Numeric, When::TM::Duration] other
158
- #
159
- # @return [Integer] other との比較により、負,0,正の値を返す
160
- #
161
- def <=>(other)
162
- self.to_f <=> other.to_f
163
- end
164
-
165
- # オブジェクトの同値
166
- #
167
- # @param [Object] other
168
- #
169
- # @return [Boolean]
170
- # [ true - 同値 ]
171
- # [ false - 非同値 ]
172
- #
173
- def ==(other)
174
- return false unless other.instance_of?(self.class)
175
- return self.duration == other.duration
176
- end
177
-
178
- #
179
- # 加算
180
- #
181
- # @param [Numeric, When::TM::Duration] other 秒数とみなす
182
- # @param [その他] other 日時とみなす
183
- #
184
- # @return [When::TM::Duration] (other が Numeric, When::TM::Duration の場合)
185
- # @return [other と同じクラス] (other がその他の場合)
186
- #
187
- def +(other)
188
- case other
189
- when Duration ; Duration.new(@duration + other.duration)
190
- when Numeric ; Duration.new(@duration + other * SECOND)
191
- else ; other + self
192
- end
193
- end
194
-
195
- #
196
- # 減算
197
- #
198
- # @param [Numeric, When::TM::Duration] other 秒数とみなす
199
- #
200
- # @return [When::TM::Duration]
201
- #
202
- def -(other)
203
- Duration.new(@duration - (other.kind_of?(Duration) ? other.duration : other * SECOND))
204
- end
205
-
206
- #
207
- # 乗算
208
- #
209
- # @param [Numeric] other
210
- #
211
- # @return [When::TM::Duration]
212
- #
213
- def *(other)
214
- Duration.new(@duration * other)
215
- end
216
-
217
- #
218
- # 除算
219
- #
220
- # @param [Numeric, When::TM::Duration] other 秒数とみなす
221
- #
222
- # @return [When::TM::Duration] (other が Numeric の場合)
223
- # @return [Numeric] (other が When::TM::Duration の場合)
224
- #
225
- def /(other)
226
- other.kind_of?(Duration) ? @duration / other.duration : Duration.new(@duration / other)
227
- end
228
-
229
- #
230
- # 時間間隔を日時分秒を表すArrayに変換する
231
- #
232
- # @param [Integer] n 最下位要素のインデクス(デフォルト When::SECOND)
233
- #
234
- # @return [Array] [ 日, 時, 分, 秒 ]
235
- #
236
- def to_dhms(n=When::SECOND)
237
- a = []
238
- m = @duration
239
- n.times do |i|
240
- d, m = m.divmod(DurationUnits[i])
241
- a << d
242
- end
243
- a << m / DurationUnits[n]
244
- a
245
- end
246
-
247
- #
248
- # 時間間隔の要素を取り出す
249
- #
250
- # @param [Integer] n 要素のインデクス
251
- #
252
- # @return [Numeric] (秒は Float, その他は Integer)
253
- #
254
- def [](n)
255
- to_dhms([n+1,When::SECOND].min)[n]
256
- end
257
-
258
- #
259
- # 指定時刻よりselfの時間間隔だけ後の時刻オブジェクト
260
- #
261
- # @param [::Time, When::TM::TemporalPosition] time 指定時刻
262
- #
263
- # @return [引数と同種の時刻オブジェクト]
264
- #
265
- def after(time=Time.now)
266
- time + self
267
- end
268
- alias :since :after
269
-
270
- #
271
- # 指定時刻よりselfの時間間隔だけ前の時刻オブジェクト
272
- #
273
- # @param [::Time, When::TM::TemporalPosition] time 指定時刻
274
- #
275
- # @return [引数と同種の時刻オブジェクト]
276
- #
277
- def before(time=Time.now)
278
- time - self
279
- end
280
- alias :ago :before
281
-
282
- # 文字列化
283
- #
284
- # @return [String]
285
- #
286
- def to_s
287
- to_dhms.to_s
288
- end
289
-
290
- #
291
- # When::TM::Duration への変換
292
- #
293
- # @note 必ずコピーを作る
294
- #
295
- # @return [When::TM::Duration]
296
- #
297
- def to_duration
298
- Duration.new(duration)
299
- end
300
-
301
- #
302
- # ActiveSupport::Duration への変換
303
- #
304
- # @return [ActiveSupport::Duration]
305
- #
306
- def to_as_duration
307
- [[:weeks, WEEK], [:days, DAY], [:hours, HOUR], [:minutes, MINUTE], [:seconds, SECOND]].each do |unit|
308
- div, mod = duration.divmod(unit[1])
309
- return div.send(unit[0]) if mod == 0
310
- end
311
- (duration / SECOND).seconds
312
- end
313
-
314
- # coerce
315
- # @private
316
- def coerce(other)
317
- [other, @duration]
318
- end
319
-
320
- #
321
- # Duration オブジェクトの初期化
322
- #
323
- # @param [Numeric] value Duration値 / 128秒
324
- #
325
- def initialize(value)
326
- @duration = value
327
- end
328
- end
329
- end
330
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Minimum subset - A multicultural and multilingualized calendar library based on ISO 8601, ISO 19108 and RFC 5545
4
+
5
+ Copyright (C) 2013 Takashi SUGA
6
+
7
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
8
+
9
+ =end
10
+
11
+ module When
12
+
13
+ # 分解能定数
14
+
15
+ CENTURY = -4
16
+ DECADE = -3
17
+ YEAR = -2
18
+ MONTH = -1
19
+ WEEK = -0.5
20
+ DAY = 0
21
+ HOUR = 1
22
+ MINUTE = 2
23
+ SECOND = 3
24
+ STRING = 5
25
+ SYSTEM = (Float::MANT_DIG*0.3).to_i
26
+
27
+ #
28
+ # (5.2) Temporal Objects Package
29
+ #
30
+ #
31
+ module TM
32
+
33
+ # 時間次元における長さ又は距離を記述するために使うデータ型
34
+ #
35
+ # see {gml schema}[link:http://schemas.opengis.net/gml/3.1.1/base/temporal.xsd#duration]
36
+ #
37
+ class Duration
38
+
39
+ # 物理的な時間間隔の定数
40
+ #
41
+ # 時間の「秒」を Float で表現して丸め誤差が発生しない範囲で、
42
+ # もっとも大きな時間間隔(86400s を 2 の因数で割りつくした値)
43
+ # を単位 SYSTEM とする
44
+ #
45
+ SYSTEM = 1.0
46
+ DAY = SYSTEM * 675
47
+ YEAR = DAY * 365.2425
48
+ MONTH = YEAR / 12
49
+ WEEK = DAY * 7
50
+ HOUR = DAY / 24
51
+ MINUTE = HOUR / 60
52
+ SECOND = MINUTE / 60
53
+
54
+ UnitName = {YEAR=>'year', MONTH =>'month', WEEK =>'week', DAY =>'day',
55
+ HOUR=>'hour', MINUTE=>'minute', SECOND=>'second', SYSTEM=>'system'}
56
+ Unit = UnitName.invert
57
+ DurationUnits = [DAY, HOUR, MINUTE, SECOND]
58
+
59
+ #
60
+ # オブジェクト生成用クラスメソッド
61
+ #
62
+ class << self
63
+ #
64
+ # 日時分秒からのオブジェクト生成
65
+ #
66
+ # @param [Array<Numeric>] value ( 日, 時, 分, 秒 ) 下位の桁は省略可
67
+ #
68
+ # @return [When::TM::Duration]
69
+ #
70
+ def dhms(*value)
71
+ units = DurationUnits.dup
72
+ Duration.new(value.inject(0) {|s,v| s + v * units.shift})
73
+ end
74
+
75
+ #
76
+ # メソッド名に相当する単位で表した value に対応する When::TM::Duration を生成する
77
+ # @method unit
78
+ # @param [Numeric] value
79
+ # @return [When::TM::Duration]
80
+ # @note unit は second, minute, hour, day, week に読み替える
81
+
82
+ # @private
83
+ Unit.keys.each do |key|
84
+ module_eval %Q{
85
+ def #{key}(value)
86
+ new(value * Unit['#{key}'])
87
+ end
88
+ }
89
+ end
90
+ end
91
+
92
+ # 時間間隔の長さ (128秒単位)
93
+ #
94
+ # @return [Numeric]
95
+ #
96
+ attr_accessor :duration
97
+
98
+ #
99
+ # メソッド名に相当する単位で表した時間間隔の大きさ
100
+ # @method unit
101
+ # @return [Numeric]
102
+ # @note unit は second, minute, hour, day, week に読み替える
103
+
104
+ # @private
105
+ Unit.keys.each do |key|
106
+ module_eval %Q{
107
+ def #{key}
108
+ duration / Unit['#{key}']
109
+ end
110
+ }
111
+ end
112
+
113
+ # 時間間隔の長さ / 秒
114
+ #
115
+ # @return [Float]
116
+ #
117
+ def to_f
118
+ duration / SECOND
119
+ end
120
+ alias :to_float :to_f
121
+
122
+ # 時間間隔の長さ / 秒
123
+ #
124
+ # @return [Integer] (四捨五入値)
125
+ #
126
+ def to_i
127
+ to_f.round
128
+ end
129
+ alias :to_int :to_i
130
+
131
+ # 符号反転
132
+ #
133
+ # @return [When::TM::Duration]
134
+ #
135
+ def -@
136
+ Duration.new(-@duration)
137
+ end
138
+
139
+ # 絶対値
140
+ #
141
+ # @return [When::TM::Duration]
142
+ #
143
+ def abs
144
+ sign >= 0 ? self.dup : -self
145
+ end
146
+
147
+ # 符号
148
+ #
149
+ # @return [Integer] 0 との比較により、負,0,正の値を返す
150
+ #
151
+ def sign
152
+ @duration <=> 0
153
+ end
154
+
155
+ # 比較
156
+ #
157
+ # @param [Numeric, When::TM::Duration] other
158
+ #
159
+ # @return [Integer] other との比較により、負,0,正の値を返す
160
+ #
161
+ def <=>(other)
162
+ self.to_f <=> other.to_f
163
+ end
164
+
165
+ # オブジェクトの同値
166
+ #
167
+ # @param [Object] other
168
+ #
169
+ # @return [Boolean]
170
+ # [ true - 同値 ]
171
+ # [ false - 非同値 ]
172
+ #
173
+ def ==(other)
174
+ return false unless other.instance_of?(self.class)
175
+ return self.duration == other.duration
176
+ end
177
+
178
+ #
179
+ # 加算
180
+ #
181
+ # @param [Numeric, When::TM::Duration] other 秒数とみなす
182
+ # @param [その他] other 日時とみなす
183
+ #
184
+ # @return [When::TM::Duration] (other が Numeric, When::TM::Duration の場合)
185
+ # @return [other と同じクラス] (other がその他の場合)
186
+ #
187
+ def +(other)
188
+ case other
189
+ when Duration ; Duration.new(@duration + other.duration)
190
+ when Numeric ; Duration.new(@duration + other * SECOND)
191
+ else ; other + self
192
+ end
193
+ end
194
+
195
+ #
196
+ # 減算
197
+ #
198
+ # @param [Numeric, When::TM::Duration] other 秒数とみなす
199
+ #
200
+ # @return [When::TM::Duration]
201
+ #
202
+ def -(other)
203
+ Duration.new(@duration - (other.kind_of?(Duration) ? other.duration : other * SECOND))
204
+ end
205
+
206
+ #
207
+ # 乗算
208
+ #
209
+ # @param [Numeric] other
210
+ #
211
+ # @return [When::TM::Duration]
212
+ #
213
+ def *(other)
214
+ Duration.new(@duration * other)
215
+ end
216
+
217
+ #
218
+ # 除算
219
+ #
220
+ # @param [Numeric, When::TM::Duration] other 秒数とみなす
221
+ #
222
+ # @return [When::TM::Duration] (other が Numeric の場合)
223
+ # @return [Numeric] (other が When::TM::Duration の場合)
224
+ #
225
+ def /(other)
226
+ other.kind_of?(Duration) ? @duration / other.duration : Duration.new(@duration / other)
227
+ end
228
+
229
+ #
230
+ # 時間間隔を日時分秒を表すArrayに変換する
231
+ #
232
+ # @param [Integer] n 最下位要素のインデクス(デフォルト When::SECOND)
233
+ #
234
+ # @return [Array] [ 日, 時, 分, 秒 ]
235
+ #
236
+ def to_dhms(n=When::SECOND)
237
+ a = []
238
+ m = @duration
239
+ n.times do |i|
240
+ d, m = m.divmod(DurationUnits[i])
241
+ a << d
242
+ end
243
+ a << m / DurationUnits[n]
244
+ a
245
+ end
246
+
247
+ #
248
+ # 時間間隔の要素を取り出す
249
+ #
250
+ # @param [Integer] n 要素のインデクス
251
+ #
252
+ # @return [Numeric] (秒は Float, その他は Integer)
253
+ #
254
+ def [](n)
255
+ to_dhms([n+1,When::SECOND].min)[n]
256
+ end
257
+
258
+ #
259
+ # 指定時刻よりselfの時間間隔だけ後の時刻オブジェクト
260
+ #
261
+ # @param [::Time, When::TM::TemporalPosition] time 指定時刻
262
+ #
263
+ # @return [引数と同種の時刻オブジェクト]
264
+ #
265
+ def after(time=Time.now)
266
+ time + self
267
+ end
268
+ alias :since :after
269
+
270
+ #
271
+ # 指定時刻よりselfの時間間隔だけ前の時刻オブジェクト
272
+ #
273
+ # @param [::Time, When::TM::TemporalPosition] time 指定時刻
274
+ #
275
+ # @return [引数と同種の時刻オブジェクト]
276
+ #
277
+ def before(time=Time.now)
278
+ time - self
279
+ end
280
+ alias :ago :before
281
+
282
+ # When::TM::Duration オブジェクトを分かりやすい文字列にして返します
283
+ #
284
+ # @return [String] to_s と同様
285
+ #
286
+ def inspect
287
+ to_s
288
+ end
289
+
290
+ # 文字列化
291
+ #
292
+ # @return [String]
293
+ #
294
+ def to_s
295
+ to_dhms.to_s
296
+ end
297
+
298
+ #
299
+ # When::TM::Duration への変換
300
+ #
301
+ # @note 必ずコピーを作る
302
+ #
303
+ # @return [When::TM::Duration]
304
+ #
305
+ def to_duration
306
+ Duration.new(duration)
307
+ end
308
+
309
+ #
310
+ # ActiveSupport::Duration への変換
311
+ #
312
+ # @return [ActiveSupport::Duration]
313
+ #
314
+ def to_as_duration
315
+ [[:weeks, WEEK], [:days, DAY], [:hours, HOUR], [:minutes, MINUTE], [:seconds, SECOND]].each do |unit|
316
+ div, mod = duration.divmod(unit[1])
317
+ return div.send(unit[0]) if mod == 0
318
+ end
319
+ (duration / SECOND).seconds
320
+ end
321
+
322
+ # coerce
323
+ # @private
324
+ def coerce(other)
325
+ [other, @duration]
326
+ end
327
+
328
+ #
329
+ # Duration オブジェクトの初期化
330
+ #
331
+ # @param [Numeric] value Duration値 / 128秒
332
+ #
333
+ def initialize(value)
334
+ @duration = value
335
+ end
336
+ end
337
+ end
338
+ end