Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 798 lines (754 sloc) 32.241 kb
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
1
2 #
3 # == Introduction
4 #
5 # This library extends the Time class:
6 # * conversion between date string and time object.
7 # * date-time defined by RFC 2822
8 # * HTTP-date defined by RFC 2616
9 # * dateTime defined by XML Schema Part 2: Datatypes (ISO 8601)
d6187d5 akr * lib/time.rb (Time.parse): extract fractional seconds using
akr authored
10 # * various formats handled by Date._parse (string to time only)
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
11 #
12 # == Design Issues
13 #
14 # === Specialized interface
15 #
12ec4a1 akr fix typos.
akr authored
16 # This library provides methods dedicated to special purposes:
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
17 # * RFC 2822, RFC 2616 and XML Schema.
18 # * They makes usual life easier.
19 #
20 # === Doesn't depend on strftime
21 #
22 # This library doesn't use +strftime+. Especially #rfc2822 doesn't depend
23 # on +strftime+ because:
24 #
25 # * %a and %b are locale sensitive
26 #
27 # Since they are locale sensitive, they may be replaced to
28 # invalid weekday/month name in some locales.
29 # Since ruby-1.6 doesn't invoke setlocale by default,
30 # the problem doesn't arise until some external library invokes setlocale.
31 # Ruby/GTK is the example of such library.
32 #
33 # * %z is not portable
34 #
35 # %z is required to generate zone in date-time of RFC 2822
36 # but it is not portable.
37 #
38 # == Revision Information
39 #
ff1027d akr new file.
akr authored
40 # $Id$
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
41 #
ff1027d akr new file.
akr authored
42
43 require 'parsedate'
44
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
45 #
46 # Implements the extensions to the Time class that are described in the
47 # documentation for the time.rb library.
48 #
ff1027d akr new file.
akr authored
49 class Time
50 class << Time
51
52 ZoneOffset = {
53 'UTC' => 0,
54 # ISO 8601
55 'Z' => 0,
56 # RFC 822
57 'UT' => 0, 'GMT' => 0,
58 'EST' => -5, 'EDT' => -4,
59 'CST' => -6, 'CDT' => -5,
60 'MST' => -7, 'MDT' => -6,
61 'PST' => -8, 'PDT' => -7,
62 # Following definition of military zones is original one.
7f30e1a akr * lib/time.rb: recognize +00:00 and GMT as a localtime.
akr authored
63 # See RFC 1123 and RFC 2822 for the error in RFC 822.
ff1027d akr new file.
akr authored
64 'A' => +1, 'B' => +2, 'C' => +3, 'D' => +4, 'E' => +5, 'F' => +6,
65 'G' => +7, 'H' => +8, 'I' => +9, 'K' => +10, 'L' => +11, 'M' => +12,
66 'N' => -1, 'O' => -2, 'P' => -3, 'Q' => -4, 'R' => -5, 'S' => -6,
67 'T' => -7, 'U' => -8, 'V' => -9, 'W' => -10, 'X' => -11, 'Y' => -12,
68 }
859faba akr * lib/time.rb: use Time#utc_offset.
akr authored
69 def zone_offset(zone, year=Time.now.year)
ff1027d akr new file.
akr authored
70 off = nil
71 zone = zone.upcase
544a70f akr * instruby.rb, ext/extmk.rb, lib/benchmark.rb, lib/cgi.rb,
akr authored
72 if /\A([+-])(\d\d):?(\d\d)\z/ =~ zone
ff1027d akr new file.
akr authored
73 off = ($1 == '-' ? -1 : 1) * ($2.to_i * 60 + $3.to_i) * 60
544a70f akr * instruby.rb, ext/extmk.rb, lib/benchmark.rb, lib/cgi.rb,
akr authored
74 elsif /\A[+-]\d\d\z/ =~ zone
ff1027d akr new file.
akr authored
75 off = zone.to_i * 3600
76 elsif ZoneOffset.include?(zone)
77 off = ZoneOffset[zone] * 3600
78 elsif ((t = Time.local(year, 1, 1)).zone.upcase == zone rescue false)
859faba akr * lib/time.rb: use Time#utc_offset.
akr authored
79 off = t.utc_offset
ff1027d akr new file.
akr authored
80 elsif ((t = Time.local(year, 7, 1)).zone.upcase == zone rescue false)
859faba akr * lib/time.rb: use Time#utc_offset.
akr authored
81 off = t.utc_offset
ff1027d akr new file.
akr authored
82 end
83 off
84 end
85
7f30e1a akr * lib/time.rb: recognize +00:00 and GMT as a localtime.
akr authored
86 def zone_utc?(zone)
87 # * +0000 means localtime. [RFC 2822]
88 # * GMT is a localtime abbreviation in Europe/London, etc.
89 if /\A(?:-00:00|-0000|-00|UTC|Z|UT)\z/i =~ zone
90 true
91 else
92 false
93 end
94 end
95 private :zone_utc?
96
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
97 LeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
98 CommonYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
99 def month_days(y, m)
100 if ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)
101 LeapYearMonthDays[m-1]
102 else
103 CommonYearMonthDays[m-1]
104 end
105 end
106 private :month_days
107
108 def apply_offset(year, mon, day, hour, min, sec, off)
109 if off < 0
110 off = -off
111 off, o = off.divmod(60)
112 if o != 0 then sec += o; o, sec = sec.divmod(60); off += o end
113 off, o = off.divmod(60)
114 if o != 0 then min += o; o, min = min.divmod(60); off += o end
115 off, o = off.divmod(24)
116 if o != 0 then hour += o; o, hour = hour.divmod(24); off += o end
117 if off != 0
118 day += off
eb97f7d akr * lib/time.rb (Time.apply_offset): fix a problem with last day of
akr authored
119 if month_days(year, mon) < day
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
120 mon += 1
121 if 12 < mon
122 mon = 1
123 year += 1
124 end
125 day = 1
126 end
127 end
128 elsif 0 < off
129 off, o = off.divmod(60)
130 if o != 0 then sec -= o; o, sec = sec.divmod(60); off -= o end
131 off, o = off.divmod(60)
132 if o != 0 then min -= o; o, min = min.divmod(60); off -= o end
133 off, o = off.divmod(24)
134 if o != 0 then hour -= o; o, hour = hour.divmod(24); off -= o end
135 if off != 0 then
136 day -= off
137 if day < 1
138 mon -= 1
139 if mon < 1
140 year -= 1
141 mon = 12
142 end
143 day = month_days(year, mon)
144 end
145 end
146 end
147 return year, mon, day, hour, min, sec
148 end
149 private :apply_offset
150
d6187d5 akr * lib/time.rb (Time.parse): extract fractional seconds using
akr authored
151 def make_time(year, mon, day, hour, min, sec, sec_fraction, zone, now)
152 usec = nil
153 usec = (sec_fraction * 1000000).to_i if sec_fraction
154 if now
155 begin
156 break if year; year = now.year
157 break if mon; mon = now.mon
158 break if day; day = now.day
159 break if hour; hour = now.hour
160 break if min; min = now.min
161 break if sec; sec = now.sec
162 break if sec_fraction; usec = now.tv_usec
163 end until true
164 end
165
166 year ||= 1970
167 mon ||= 1
168 day ||= 1
169 hour ||= 0
170 min ||= 0
171 sec ||= 0
172 usec ||= 0
173
174 off = nil
175 off = zone_offset(zone, year) if zone
176
177 if off
178 year, mon, day, hour, min, sec =
179 apply_offset(year, mon, day, hour, min, sec, off)
180 t = Time.utc(year, mon, day, hour, min, sec, usec)
181 t.localtime if !zone_utc?(zone)
182 t
183 else
718bc74 * time.c (time_dup): duplicate the class of original time.
matz authored
184 self.local(year, mon, day, hour, min, sec, usec)
d6187d5 akr * lib/time.rb (Time.parse): extract fractional seconds using
akr authored
185 end
186 end
187 private :make_time
188
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
189 #
d6187d5 akr * lib/time.rb (Time.parse): extract fractional seconds using
akr authored
190 # Parses +date+ using Date._parse and converts it to a Time object.
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
191 #
192 # If a block is given, the year described in +date+ is converted by the
193 # block. For example:
194 #
195 # Time.parse(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
196 #
197 # If the upper components of the given time are broken or missing, they are
198 # supplied with those of +now+. For the lower components, the minimum
199 # values (1 or 0) are assumed if broken or missing. For example:
200 #
201 # # Suppose it is "Thu Nov 29 14:33:20 GMT 2001" now and
202 # # your timezone is GMT:
203 # Time.parse("16:30") #=> Thu Nov 29 16:30:00 GMT 2001
204 # Time.parse("7/23") #=> Mon Jul 23 00:00:00 GMT 2001
1f243d1 yyyy/mm is not an acceptable format.
tadf authored
205 # Time.parse("Aug 31") #=> Fri Aug 31 00:00:00 GMT 2001
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
206 #
207 # Since there are numerous conflicts among locally defined timezone
208 # abbreviations all over the world, this method is not made to
209 # understand all of them. For example, the abbreviation "CST" is
210 # used variously as:
211 #
212 # -06:00 in America/Chicago,
213 # -05:00 in America/Havana,
214 # +08:00 in Asia/Harbin,
215 # +09:30 in Australia/Darwin,
216 # +10:30 in Australia/Adelaide,
217 # etc.
218 #
219 # Based on the fact, this method only understands the timezone
220 # abbreviations described in RFC 822 and the system timezone, in the
221 # order named. (i.e. a definition in RFC 822 overrides the system
222 # timezone definition.) The system timezone is taken from
223 # <tt>Time.local(year, 1, 1).zone</tt> and
224 # <tt>Time.local(year, 7, 1).zone</tt>.
225 # If the extracted timezone abbreviation does not match any of them,
226 # it is ignored and the given time is regarded as a local time.
227 #
d6187d5 akr * lib/time.rb (Time.parse): extract fractional seconds using
akr authored
228 # ArgumentError is raised if Date._parse cannot extract information from
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
229 # +date+ or Time class cannot represent specified date.
230 #
231 # This method can be used as fail-safe for other parsing methods as:
232 #
233 # Time.rfc2822(date) rescue Time.parse(date)
234 # Time.httpdate(date) rescue Time.parse(date)
235 # Time.xmlschema(date) rescue Time.parse(date)
236 #
237 # A failure for Time.parse should be checked, though.
238 #
ff1027d akr new file.
akr authored
239 def parse(date, now=Time.now)
d6187d5 akr * lib/time.rb (Time.parse): extract fractional seconds using
akr authored
240 d = Date._parse(date, false)
241 year = d[:year]
9246a73 consistent parentheses in assignment RHS.
matz authored
242 year = yield(year) if year && block_given?
d6187d5 akr * lib/time.rb (Time.parse): extract fractional seconds using
akr authored
243 make_time(year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
ff1027d akr new file.
akr authored
244 end
245
246 MonthValue = {
247 'JAN' => 1, 'FEB' => 2, 'MAR' => 3, 'APR' => 4, 'MAY' => 5, 'JUN' => 6,
248 'JUL' => 7, 'AUG' => 8, 'SEP' => 9, 'OCT' =>10, 'NOV' =>11, 'DEC' =>12
249 }
250
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
251 #
252 # Parses +date+ as date-time defined by RFC 2822 and converts it to a Time
253 # object. The format is identical to the date format defined by RFC 822 and
254 # updated by RFC 1123.
255 #
256 # ArgumentError is raised if +date+ is not compliant with RFC 2822
257 # or Time class cannot represent specified date.
258 #
259 # See #rfc2822 for more information on this format.
260 #
ff1027d akr new file.
akr authored
261 def rfc2822(date)
262 if /\A\s*
263 (?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)?
264 (\d{1,2})\s+
265 (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
266 (\d{2,})\s+
267 (\d{2})\s*
268 :\s*(\d{2})\s*
269 (?::\s*(\d{2}))?\s+
544a70f akr * instruby.rb, ext/extmk.rb, lib/benchmark.rb, lib/cgi.rb,
akr authored
270 ([+-]\d{4}|
ff1027d akr new file.
akr authored
271 UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix =~ date
272 # Since RFC 2822 permit comments, the regexp has no right anchor.
273 day = $1.to_i
274 mon = MonthValue[$2.upcase]
275 year = $3.to_i
276 hour = $4.to_i
277 min = $5.to_i
278 sec = $6 ? $6.to_i : 0
279 zone = $7
280
281 # following year completion is compliant with RFC 2822.
282 year = if year < 50
283 2000 + year
284 elsif year < 1000
285 1900 + year
286 else
287 year
288 end
289
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
290 year, mon, day, hour, min, sec =
291 apply_offset(year, mon, day, hour, min, sec, zone_offset(zone))
718bc74 * time.c (time_dup): duplicate the class of original time.
matz authored
292 t = self.utc(year, mon, day, hour, min, sec)
7f30e1a akr * lib/time.rb: recognize +00:00 and GMT as a localtime.
akr authored
293 t.localtime if !zone_utc?(zone)
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
294 t
ff1027d akr new file.
akr authored
295 else
296 raise ArgumentError.new("not RFC 2822 compliant date: #{date.inspect}")
297 end
298 end
299 alias rfc822 rfc2822
300
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
301 #
302 # Parses +date+ as HTTP-date defined by RFC 2616 and converts it to a Time
303 # object.
304 #
305 # ArgumentError is raised if +date+ is not compliant with RFC 2616 or Time
306 # class cannot represent specified date.
307 #
308 # See #httpdate for more information on this format.
309 #
ff1027d akr new file.
akr authored
310 def httpdate(date)
311 if /\A\s*
312 (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\x20
313 (\d{2})\x20
314 (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
315 (\d{4})\x20
316 (\d{2}):(\d{2}):(\d{2})\x20
317 GMT
318 \s*\z/ix =~ date
718bc74 * time.c (time_dup): duplicate the class of original time.
matz authored
319 self.rfc2822(date)
ff1027d akr new file.
akr authored
320 elsif /\A\s*
321 (?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\x20
322 (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d)\x20
323 (\d\d):(\d\d):(\d\d)\x20
324 GMT
325 \s*\z/ix =~ date
718bc74 * time.c (time_dup): duplicate the class of original time.
matz authored
326 self.parse(date)
ff1027d akr new file.
akr authored
327 elsif /\A\s*
328 (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\x20
329 (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
330 (\d\d|\x20\d)\x20
331 (\d\d):(\d\d):(\d\d)\x20
332 (\d{4})
333 \s*\z/ix =~ date
718bc74 * time.c (time_dup): duplicate the class of original time.
matz authored
334 self.utc($6.to_i, MonthValue[$1.upcase], $2.to_i,
ff1027d akr new file.
akr authored
335 $3.to_i, $4.to_i, $5.to_i)
336 else
337 raise ArgumentError.new("not RFC 2616 compliant date: #{date.inspect}")
338 end
339 end
340
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
341 #
342 # Parses +date+ as dateTime defined by XML Schema and converts it to a Time
343 # object. The format is restricted version of the format defined by ISO
344 # 8601.
345 #
346 # ArgumentError is raised if +date+ is not compliant with the format or Time
347 # class cannot represent specified date.
348 #
349 # See #xmlschema for more information on this format.
350 #
ff1027d akr new file.
akr authored
351 def xmlschema(date)
352 if /\A\s*
353 (-?\d+)-(\d\d)-(\d\d)
354 T
355 (\d\d):(\d\d):(\d\d)
356 (\.\d*)?
544a70f akr * instruby.rb, ext/extmk.rb, lib/benchmark.rb, lib/cgi.rb,
akr authored
357 (Z|[+-]\d\d:\d\d)?
ff1027d akr new file.
akr authored
358 \s*\z/ix =~ date
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
359 year = $1.to_i
360 mon = $2.to_i
361 day = $3.to_i
362 hour = $4.to_i
363 min = $5.to_i
364 sec = $6.to_i
365 usec = 0
366 usec = $7.to_f * 1000000 if $7
367 if $8
368 zone = $8
369 year, mon, day, hour, min, sec =
370 apply_offset(year, mon, day, hour, min, sec, zone_offset(zone))
371 Time.utc(year, mon, day, hour, min, sec, usec)
372 else
373 Time.local(year, mon, day, hour, min, sec, usec)
374 end
ff1027d akr new file.
akr authored
375 else
376 raise ArgumentError.new("invalid date: #{date.inspect}")
377 end
378 end
379 alias iso8601 xmlschema
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
380 end # class << self
381
382 #
383 # Returns a string which represents the time as date-time defined by RFC 2822:
384 #
385 # day-of-week, DD month-name CCYY hh:mm:ss zone
386 #
387 # where zone is [+-]hhmm.
388 #
389 # If +self+ is a UTC time, -0000 is used as zone.
390 #
ff1027d akr new file.
akr authored
391 def rfc2822
392 sprintf('%s, %02d %s %d %02d:%02d:%02d ',
393 RFC2822_DAY_NAME[wday],
394 day, RFC2822_MONTH_NAME[mon-1], year,
395 hour, min, sec) +
396 if utc?
9ceb358 akr * lib/time.rb (Time.rfc2822, Time#rfc2822): preserve localtimeness.
akr authored
397 '-0000'
ff1027d akr new file.
akr authored
398 else
859faba akr * lib/time.rb: use Time#utc_offset.
akr authored
399 off = utc_offset
400 sign = off < 0 ? '-' : '+'
401 sprintf('%s%02d%02d', sign, *(off.abs / 60).divmod(60))
ff1027d akr new file.
akr authored
402 end
403 end
404 alias rfc822 rfc2822
405
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
406 RFC2822_DAY_NAME = [
407 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
408 ]
409 RFC2822_MONTH_NAME = [
410 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
411 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
412 ]
ff1027d akr new file.
akr authored
413
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
414 #
415 # Returns a string which represents the time as rfc1123-date of HTTP-date
416 # defined by RFC 2616:
417 #
418 # day-of-week, DD month-name CCYY hh:mm:ss GMT
419 #
420 # Note that the result is always UTC (GMT).
421 #
ff1027d akr new file.
akr authored
422 def httpdate
423 t = dup.utc
424 sprintf('%s, %02d %s %d %02d:%02d:%02d GMT',
425 RFC2822_DAY_NAME[t.wday],
426 t.day, RFC2822_MONTH_NAME[t.mon-1], t.year,
427 t.hour, t.min, t.sec)
428 end
429
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
430 #
431 # Returns a string which represents the time as dateTime defined by XML
432 # Schema:
433 #
434 # CCYY-MM-DDThh:mm:ssTZD
435 # CCYY-MM-DDThh:mm:ss.sssTZD
436 #
437 # where TZD is Z or [+-]hh:mm.
438 #
439 # If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise.
440 #
441 # +fractional_seconds+ specifies a number of digits of fractional seconds.
12ec4a1 akr fix typos.
akr authored
442 # Its default value is 0.
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
443 #
0334509 akr * lib/time.rb (Time#xmlschema): new optional argument
akr authored
444 def xmlschema(fraction_digits=0)
ff1027d akr new file.
akr authored
445 sprintf('%d-%02d-%02dT%02d:%02d:%02d',
446 year, mon, day, hour, min, sec) +
0334509 akr * lib/time.rb (Time#xmlschema): new optional argument
akr authored
447 if fraction_digits == 0
ff1027d akr new file.
akr authored
448 ''
0334509 akr * lib/time.rb (Time#xmlschema): new optional argument
akr authored
449 elsif fraction_digits <= 6
450 '.' + sprintf('%06d', usec)[0, fraction_digits]
ff1027d akr new file.
akr authored
451 else
0334509 akr * lib/time.rb (Time#xmlschema): new optional argument
akr authored
452 '.' + sprintf('%06d', usec) + '0' * (fraction_digits - 6)
ff1027d akr new file.
akr authored
453 end +
454 if utc?
455 'Z'
456 else
859faba akr * lib/time.rb: use Time#utc_offset.
akr authored
457 off = utc_offset
458 sign = off < 0 ? '-' : '+'
459 sprintf('%s%02d:%02d', sign, *(off.abs / 60).divmod(60))
ff1027d akr new file.
akr authored
460 end
461 end
462 alias iso8601 xmlschema
463 end
464
465 if __FILE__ == $0
ffb471c akr * lib/pp.rb: Use Test::Unit.
akr authored
466 require 'test/unit'
ff1027d akr new file.
akr authored
467
961965c Converted RD to RDoc, with some changes/additions.
gsinclair authored
468 class TimeExtentionTest < Test::Unit::TestCase # :nodoc:
ff1027d akr new file.
akr authored
469 def test_rfc822
470 assert_equal(Time.utc(1976, 8, 26, 14, 30) + 4 * 3600,
471 Time.rfc2822("26 Aug 76 14:30 EDT"))
472 assert_equal(Time.utc(1976, 8, 27, 9, 32) + 7 * 3600,
473 Time.rfc2822("27 Aug 76 09:32 PDT"))
474 end
475
476 def test_rfc2822
477 assert_equal(Time.utc(1997, 11, 21, 9, 55, 6) + 6 * 3600,
478 Time.rfc2822("Fri, 21 Nov 1997 09:55:06 -0600"))
479 assert_equal(Time.utc(2003, 7, 1, 10, 52, 37) - 2 * 3600,
480 Time.rfc2822("Tue, 1 Jul 2003 10:52:37 +0200"))
481 assert_equal(Time.utc(1997, 11, 21, 10, 1, 10) + 6 * 3600,
482 Time.rfc2822("Fri, 21 Nov 1997 10:01:10 -0600"))
483 assert_equal(Time.utc(1997, 11, 21, 11, 0, 0) + 6 * 3600,
484 Time.rfc2822("Fri, 21 Nov 1997 11:00:00 -0600"))
485 assert_equal(Time.utc(1997, 11, 24, 14, 22, 1) + 8 * 3600,
486 Time.rfc2822("Mon, 24 Nov 1997 14:22:01 -0800"))
4c96cae akr * lib/pathname.rb: use assert_raise instead of assert_raises.
akr authored
487 begin
488 Time.at(-1)
489 rescue ArgumentError
490 # ignore
491 else
492 assert_equal(Time.utc(1969, 2, 13, 23, 32, 54) + 3 * 3600 + 30 * 60,
493 Time.rfc2822("Thu, 13 Feb 1969 23:32:54 -0330"))
494 assert_equal(Time.utc(1969, 2, 13, 23, 32, 0) + 3 * 3600 + 30 * 60,
495 Time.rfc2822(" Thu,
496 13
497 Feb
498 1969
499 23:32
500 -0330 (Newfoundland Time)"))
501 end
ff1027d akr new file.
akr authored
502 assert_equal(Time.utc(1997, 11, 21, 9, 55, 6),
503 Time.rfc2822("21 Nov 97 09:55:06 GMT"))
504 assert_equal(Time.utc(1997, 11, 21, 9, 55, 6) + 6 * 3600,
505 Time.rfc2822("Fri, 21 Nov 1997 09 : 55 : 06 -0600"))
4c96cae akr * lib/pathname.rb: use assert_raise instead of assert_raises.
akr authored
506 assert_raise(ArgumentError) {
ff1027d akr new file.
akr authored
507 # inner comment is not supported.
508 Time.rfc2822("Fri, 21 Nov 1997 09(comment): 55 : 06 -0600")
509 }
510 end
511
512 def test_rfc2616
513 t = Time.utc(1994, 11, 6, 8, 49, 37)
514 assert_equal(t, Time.httpdate("Sun, 06 Nov 1994 08:49:37 GMT"))
515 assert_equal(t, Time.httpdate("Sunday, 06-Nov-94 08:49:37 GMT"))
516 assert_equal(t, Time.httpdate("Sun Nov 6 08:49:37 1994"))
517 assert_equal(Time.utc(1995, 11, 15, 6, 25, 24),
518 Time.httpdate("Wed, 15 Nov 1995 06:25:24 GMT"))
519 assert_equal(Time.utc(1995, 11, 15, 4, 58, 8),
520 Time.httpdate("Wed, 15 Nov 1995 04:58:08 GMT"))
521 assert_equal(Time.utc(1994, 11, 15, 8, 12, 31),
522 Time.httpdate("Tue, 15 Nov 1994 08:12:31 GMT"))
523 assert_equal(Time.utc(1994, 12, 1, 16, 0, 0),
524 Time.httpdate("Thu, 01 Dec 1994 16:00:00 GMT"))
525 assert_equal(Time.utc(1994, 10, 29, 19, 43, 31),
526 Time.httpdate("Sat, 29 Oct 1994 19:43:31 GMT"))
527 assert_equal(Time.utc(1994, 11, 15, 12, 45, 26),
528 Time.httpdate("Tue, 15 Nov 1994 12:45:26 GMT"))
529 assert_equal(Time.utc(1999, 12, 31, 23, 59, 59),
530 Time.httpdate("Fri, 31 Dec 1999 23:59:59 GMT"))
531 end
532
9ceb358 akr * lib/time.rb (Time.rfc2822, Time#rfc2822): preserve localtimeness.
akr authored
533 def test_rfc3339
534 t = Time.utc(1985, 4, 12, 23, 20, 50, 520000)
535 s = "1985-04-12T23:20:50.52Z"
536 assert_equal(t, Time.iso8601(s))
537 assert_equal(s, t.iso8601(2))
538
539 t = Time.utc(1996, 12, 20, 0, 39, 57)
540 s = "1996-12-19T16:39:57-08:00"
541 assert_equal(t, Time.iso8601(s))
542 # There is no way to generate time string with arbitrary timezone.
543 s = "1996-12-20T00:39:57Z"
544 assert_equal(t, Time.iso8601(s))
545 assert_equal(s, t.iso8601)
546
547 t = Time.utc(1990, 12, 31, 23, 59, 60)
548 s = "1990-12-31T23:59:60Z"
549 assert_equal(t, Time.iso8601(s))
550 # leap second is representable only if timezone file has it.
551 s = "1990-12-31T15:59:60-08:00"
552 assert_equal(t, Time.iso8601(s))
553
4c96cae akr * lib/pathname.rb: use assert_raise instead of assert_raises.
akr authored
554 begin
555 Time.at(-1)
556 rescue ArgumentError
557 # ignore
558 else
559 t = Time.utc(1937, 1, 1, 11, 40, 27, 870000)
560 s = "1937-01-01T12:00:27.87+00:20"
561 assert_equal(t, Time.iso8601(s))
562 end
9ceb358 akr * lib/time.rb (Time.rfc2822, Time#rfc2822): preserve localtimeness.
akr authored
563 end
564
ff1027d akr new file.
akr authored
565 # http://www.w3.org/TR/xmlschema-2/
566 def test_xmlschema
567 assert_equal(Time.utc(1999, 5, 31, 13, 20, 0) + 5 * 3600,
568 Time.xmlschema("1999-05-31T13:20:00-05:00"))
569 assert_equal(Time.local(2000, 1, 20, 12, 0, 0),
570 Time.xmlschema("2000-01-20T12:00:00"))
571 assert_equal(Time.utc(2000, 1, 20, 12, 0, 0),
572 Time.xmlschema("2000-01-20T12:00:00Z"))
573 assert_equal(Time.utc(2000, 1, 20, 12, 0, 0) - 12 * 3600,
574 Time.xmlschema("2000-01-20T12:00:00+12:00"))
575 assert_equal(Time.utc(2000, 1, 20, 12, 0, 0) + 13 * 3600,
576 Time.xmlschema("2000-01-20T12:00:00-13:00"))
577 assert_equal(Time.utc(2000, 3, 4, 23, 0, 0) - 3 * 3600,
578 Time.xmlschema("2000-03-04T23:00:00+03:00"))
579 assert_equal(Time.utc(2000, 3, 4, 20, 0, 0),
580 Time.xmlschema("2000-03-04T20:00:00Z"))
581 assert_equal(Time.local(2000, 1, 15, 0, 0, 0),
582 Time.xmlschema("2000-01-15T00:00:00"))
583 assert_equal(Time.local(2000, 2, 15, 0, 0, 0),
584 Time.xmlschema("2000-02-15T00:00:00"))
585 assert_equal(Time.local(2000, 1, 15, 12, 0, 0),
586 Time.xmlschema("2000-01-15T12:00:00"))
587 assert_equal(Time.utc(2000, 1, 16, 12, 0, 0),
588 Time.xmlschema("2000-01-16T12:00:00Z"))
589 assert_equal(Time.local(2000, 1, 1, 12, 0, 0),
590 Time.xmlschema("2000-01-01T12:00:00"))
591 assert_equal(Time.utc(1999, 12, 31, 23, 0, 0),
592 Time.xmlschema("1999-12-31T23:00:00Z"))
593 assert_equal(Time.local(2000, 1, 16, 12, 0, 0),
594 Time.xmlschema("2000-01-16T12:00:00"))
595 assert_equal(Time.local(2000, 1, 16, 0, 0, 0),
596 Time.xmlschema("2000-01-16T00:00:00"))
597 assert_equal(Time.utc(2000, 1, 12, 12, 13, 14),
598 Time.xmlschema("2000-01-12T12:13:14Z"))
599 assert_equal(Time.utc(2001, 4, 17, 19, 23, 17, 300000),
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
600 Time.xmlschema("2001-04-17T19:23:17.3Z"))
ff1027d akr new file.
akr authored
601 end
602
603 def test_encode_xmlschema
0334509 akr * lib/time.rb (Time#xmlschema): new optional argument
akr authored
604 t = Time.utc(2001, 4, 17, 19, 23, 17, 300000)
605 assert_equal("2001-04-17T19:23:17Z", t.xmlschema)
606 assert_equal("2001-04-17T19:23:17.3Z", t.xmlschema(1))
607 assert_equal("2001-04-17T19:23:17.300000Z", t.xmlschema(6))
608 assert_equal("2001-04-17T19:23:17.3000000Z", t.xmlschema(7))
609
610 t = Time.utc(2001, 4, 17, 19, 23, 17, 123456)
611 assert_equal("2001-04-17T19:23:17.1234560Z", t.xmlschema(7))
612 assert_equal("2001-04-17T19:23:17.123456Z", t.xmlschema(6))
613 assert_equal("2001-04-17T19:23:17.12345Z", t.xmlschema(5))
614 assert_equal("2001-04-17T19:23:17.1Z", t.xmlschema(1))
615
4c96cae akr * lib/pathname.rb: use assert_raise instead of assert_raises.
akr authored
616 begin
617 Time.at(-1)
618 rescue ArgumentError
619 # ignore
620 else
621 t = Time.utc(1960, 12, 31, 23, 0, 0, 123456)
622 assert_equal("1960-12-31T23:00:00.123456Z", t.xmlschema(6))
623 end
ff1027d akr new file.
akr authored
624 end
625
626 def test_completion
627 now = Time.local(2001,11,29,21,26,35)
628 assert_equal(Time.local( 2001,11,29,21,12),
629 Time.parse("2001/11/29 21:12", now))
630 assert_equal(Time.local( 2001,11,29),
631 Time.parse("2001/11/29", now))
632 assert_equal(Time.local( 2001,11,29),
633 Time.parse( "11/29", now))
634 #assert_equal(Time.local(2001,11,1), Time.parse("Nov", now))
635 assert_equal(Time.local( 2001,11,29,10,22),
636 Time.parse( "10:22", now))
637 end
638
639 def test_invalid
640 # They were actually used in some web sites.
4c96cae akr * lib/pathname.rb: use assert_raise instead of assert_raises.
akr authored
641 assert_raise(ArgumentError) { Time.httpdate("1 Dec 2001 10:23:57 GMT") }
642 assert_raise(ArgumentError) { Time.httpdate("Sat, 1 Dec 2001 10:25:42 GMT") }
643 assert_raise(ArgumentError) { Time.httpdate("Sat, 1-Dec-2001 10:53:55 GMT") }
644 assert_raise(ArgumentError) { Time.httpdate("Saturday, 01-Dec-2001 10:15:34 GMT") }
645 assert_raise(ArgumentError) { Time.httpdate("Saturday, 01-Dec-101 11:10:07 GMT") }
646 assert_raise(ArgumentError) { Time.httpdate("Fri, 30 Nov 2001 21:30:00 JST") }
ff1027d akr new file.
akr authored
647
648 # They were actually used in some mails.
4c96cae akr * lib/pathname.rb: use assert_raise instead of assert_raises.
akr authored
649 assert_raise(ArgumentError) { Time.rfc2822("01-5-20") }
650 assert_raise(ArgumentError) { Time.rfc2822("7/21/00") }
651 assert_raise(ArgumentError) { Time.rfc2822("2001-8-28") }
652 assert_raise(ArgumentError) { Time.rfc2822("00-5-6 1:13:06") }
653 assert_raise(ArgumentError) { Time.rfc2822("2001-9-27 9:36:49") }
654 assert_raise(ArgumentError) { Time.rfc2822("2000-12-13 11:01:11") }
655 assert_raise(ArgumentError) { Time.rfc2822("2001/10/17 04:29:55") }
656 assert_raise(ArgumentError) { Time.rfc2822("9/4/2001 9:23:19 PM") }
657 assert_raise(ArgumentError) { Time.rfc2822("01 Nov 2001 09:04:31") }
658 assert_raise(ArgumentError) { Time.rfc2822("13 Feb 2001 16:4 GMT") }
659 assert_raise(ArgumentError) { Time.rfc2822("01 Oct 00 5:41:19 PM") }
660 assert_raise(ArgumentError) { Time.rfc2822("2 Jul 00 00:51:37 JST") }
661 assert_raise(ArgumentError) { Time.rfc2822("01 11 2001 06:55:57 -0500") }
662 assert_raise(ArgumentError) { Time.rfc2822("18 \343\366\356\341\370 2000") }
663 assert_raise(ArgumentError) { Time.rfc2822("Fri, Oct 2001 18:53:32") }
664 assert_raise(ArgumentError) { Time.rfc2822("Fri, 2 Nov 2001 03:47:54") }
665 assert_raise(ArgumentError) { Time.rfc2822("Fri, 27 Jul 2001 11.14.14 +0200") }
666 assert_raise(ArgumentError) { Time.rfc2822("Thu, 2 Nov 2000 04:13:53 -600") }
667 assert_raise(ArgumentError) { Time.rfc2822("Wed, 5 Apr 2000 22:57:09 JST") }
668 assert_raise(ArgumentError) { Time.rfc2822("Mon, 11 Sep 2000 19:47:33 00000") }
669 assert_raise(ArgumentError) { Time.rfc2822("Fri, 28 Apr 2000 20:40:47 +-900") }
670 assert_raise(ArgumentError) { Time.rfc2822("Fri, 19 Jan 2001 8:15:36 AM -0500") }
671 assert_raise(ArgumentError) { Time.rfc2822("Thursday, Sep 27 2001 7:42:35 AM EST") }
672 assert_raise(ArgumentError) { Time.rfc2822("3/11/2001 1:31:57 PM Pacific Daylight Time") }
673 assert_raise(ArgumentError) { Time.rfc2822("Mi, 28 Mrz 2001 11:51:36") }
674 assert_raise(ArgumentError) { Time.rfc2822("P, 30 sept 2001 23:03:14") }
675 assert_raise(ArgumentError) { Time.rfc2822("fr, 11 aug 2000 18:39:22") }
676 assert_raise(ArgumentError) { Time.rfc2822("Fr, 21 Sep 2001 17:44:03 -1000") }
677 assert_raise(ArgumentError) { Time.rfc2822("Mo, 18 Jun 2001 19:21:40 -1000") }
678 assert_raise(ArgumentError) { Time.rfc2822("l\366, 12 aug 2000 18:53:20") }
679 assert_raise(ArgumentError) { Time.rfc2822("l\366, 26 maj 2001 00:15:58") }
680 assert_raise(ArgumentError) { Time.rfc2822("Dom, 30 Sep 2001 17:36:30") }
681 assert_raise(ArgumentError) { Time.rfc2822("%&, 31 %2/ 2000 15:44:47 -0500") }
682 assert_raise(ArgumentError) { Time.rfc2822("dom, 26 ago 2001 03:57:07 -0300") }
683 assert_raise(ArgumentError) { Time.rfc2822("ter, 04 set 2001 16:27:58 -0300") }
684 assert_raise(ArgumentError) { Time.rfc2822("Wen, 3 oct 2001 23:17:49 -0400") }
685 assert_raise(ArgumentError) { Time.rfc2822("Wen, 3 oct 2001 23:17:49 -0400") }
686 assert_raise(ArgumentError) { Time.rfc2822("ele, 11 h: 2000 12:42:15 -0500") }
687 assert_raise(ArgumentError) { Time.rfc2822("Tue, 14 Aug 2001 3:55:3 +0200") }
688 assert_raise(ArgumentError) { Time.rfc2822("Fri, 25 Aug 2000 9:3:48 +0800") }
689 assert_raise(ArgumentError) { Time.rfc2822("Fri, 1 Dec 2000 0:57:50 EST") }
690 assert_raise(ArgumentError) { Time.rfc2822("Mon, 7 May 2001 9:39:51 +0200") }
691 assert_raise(ArgumentError) { Time.rfc2822("Wed, 1 Aug 2001 16:9:15 +0200") }
692 assert_raise(ArgumentError) { Time.rfc2822("Wed, 23 Aug 2000 9:17:36 +0800") }
693 assert_raise(ArgumentError) { Time.rfc2822("Fri, 11 Aug 2000 10:4:42 +0800") }
694 assert_raise(ArgumentError) { Time.rfc2822("Sat, 15 Sep 2001 13:22:2 +0300") }
695 assert_raise(ArgumentError) { Time.rfc2822("Wed,16 \276\305\324\302 2001 20:06:25 +0800") }
696 assert_raise(ArgumentError) { Time.rfc2822("Wed,7 \312\256\322\273\324\302 2001 23:47:22 +0800") }
697 assert_raise(ArgumentError) { Time.rfc2822("=?iso-8859-1?Q?(=C5=DA),?= 10 2 2001 23:32:26 +0900 (JST)") }
698 assert_raise(ArgumentError) { Time.rfc2822("\307\341\314\343\332\311, 30 \344\346\335\343\310\321 2001 10:01:06") }
699 assert_raise(ArgumentError) { Time.rfc2822("=?iso-8859-1?Q?(=BF=E5),?= 12 =?iso-8859-1?Q?9=B7=EE?= 2001 14:52:41\n+0900 (JST)") }
ff1027d akr new file.
akr authored
700 end
7f30e1a akr * lib/time.rb: recognize +00:00 and GMT as a localtime.
akr authored
701
702 def test_zone_0000
703 assert_equal(true, Time.parse("2000-01-01T00:00:00Z").utc?)
704 assert_equal(true, Time.parse("2000-01-01T00:00:00-00:00").utc?)
705 assert_equal(false, Time.parse("2000-01-01T00:00:00+00:00").utc?)
706 assert_equal(false, Time.parse("Sat, 01 Jan 2000 00:00:00 GMT").utc?)
707 assert_equal(true, Time.parse("Sat, 01 Jan 2000 00:00:00 -0000").utc?)
708 assert_equal(false, Time.parse("Sat, 01 Jan 2000 00:00:00 +0000").utc?)
709 assert_equal(false, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 GMT").utc?)
710 assert_equal(true, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 -0000").utc?)
711 assert_equal(false, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 +0000").utc?)
712 assert_equal(true, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 UTC").utc?)
713 end
ff1027d akr new file.
akr authored
714
dc2ad49 akr * lib/time.rb (Time.parse): "Fri Jan 1 08:59:60 +0900 1999" was
akr authored
715 def test_parse_leap_second
716 t = Time.utc(1998,12,31,23,59,59)
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
717 assert_equal(t, Time.parse("Thu Dec 31 23:59:59 UTC 1998"))
718 assert_equal(t, Time.parse("Fri Dec 31 23:59:59 -0000 1998"));t.localtime
719 assert_equal(t, Time.parse("Fri Jan 1 08:59:59 +0900 1999"))
720 assert_equal(t, Time.parse("Fri Jan 1 00:59:59 +0100 1999"))
721 assert_equal(t, Time.parse("Fri Dec 31 23:59:59 +0000 1998"))
722 assert_equal(t, Time.parse("Fri Dec 31 22:59:59 -0100 1998"));t.utc
dc2ad49 akr * lib/time.rb (Time.parse): "Fri Jan 1 08:59:60 +0900 1999" was
akr authored
723 t += 1
19813ca akr add tests for leapseconds on an environment without leapseconds support.
akr authored
724 assert_equal(t, Time.parse("Thu Dec 31 23:59:60 UTC 1998"))
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
725 assert_equal(t, Time.parse("Fri Dec 31 23:59:60 -0000 1998"));t.localtime
19813ca akr add tests for leapseconds on an environment without leapseconds support.
akr authored
726 assert_equal(t, Time.parse("Fri Jan 1 08:59:60 +0900 1999"))
727 assert_equal(t, Time.parse("Fri Jan 1 00:59:60 +0100 1999"))
728 assert_equal(t, Time.parse("Fri Dec 31 23:59:60 +0000 1998"))
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
729 assert_equal(t, Time.parse("Fri Dec 31 22:59:60 -0100 1998"));t.utc
730 t += 1 if t.sec == 60
731 assert_equal(t, Time.parse("Thu Jan 1 00:00:00 UTC 1999"))
732 assert_equal(t, Time.parse("Fri Jan 1 00:00:00 -0000 1999"));t.localtime
733 assert_equal(t, Time.parse("Fri Jan 1 09:00:00 +0900 1999"))
734 assert_equal(t, Time.parse("Fri Jan 1 01:00:00 +0100 1999"))
735 assert_equal(t, Time.parse("Fri Jan 1 00:00:00 +0000 1999"))
736 assert_equal(t, Time.parse("Fri Dec 31 23:00:00 -0100 1998"))
dc2ad49 akr * lib/time.rb (Time.parse): "Fri Jan 1 08:59:60 +0900 1999" was
akr authored
737 end
738
739 def test_rfc2822_leap_second
740 t = Time.utc(1998,12,31,23,59,59)
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
741 assert_equal(t, Time.rfc2822("Thu, 31 Dec 1998 23:59:59 UTC"))
742 assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:59 -0000"));t.localtime
743 assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 08:59:59 +0900"))
744 assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:59:59 +0100"))
745 assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:59 +0000"))
746 assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 22:59:59 -0100"));t.utc
dc2ad49 akr * lib/time.rb (Time.parse): "Fri Jan 1 08:59:60 +0900 1999" was
akr authored
747 t += 1
19813ca akr add tests for leapseconds on an environment without leapseconds support.
akr authored
748 assert_equal(t, Time.rfc2822("Thu, 31 Dec 1998 23:59:60 UTC"))
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
749 assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:60 -0000"));t.localtime
19813ca akr add tests for leapseconds on an environment without leapseconds support.
akr authored
750 assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 08:59:60 +0900"))
751 assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:59:60 +0100"))
752 assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:60 +0000"))
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
753 assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 22:59:60 -0100"));t.utc
754 t += 1 if t.sec == 60
755 assert_equal(t, Time.rfc2822("Thu, 1 Jan 1999 00:00:00 UTC"))
756 assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:00:00 -0000"));t.localtime
757 assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 09:00:00 +0900"))
758 assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 01:00:00 +0100"))
759 assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:00:00 +0000"))
760 assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:00:00 -0100"))
dc2ad49 akr * lib/time.rb (Time.parse): "Fri Jan 1 08:59:60 +0900 1999" was
akr authored
761 end
762
763 def test_xmlschema_leap_second
764 t = Time.utc(1998,12,31,23,59,59)
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
765 assert_equal(t, Time.xmlschema("1998-12-31T23:59:59Z"))
766 assert_equal(t, Time.xmlschema("1998-12-31T23:59:59-00:00"));t.localtime
767 assert_equal(t, Time.xmlschema("1999-01-01T08:59:59+09:00"))
768 assert_equal(t, Time.xmlschema("1999-01-01T00:59:59+01:00"))
769 assert_equal(t, Time.xmlschema("1998-12-31T23:59:59+00:00"))
770 assert_equal(t, Time.xmlschema("1998-12-31T22:59:59-01:00"));t.utc
dc2ad49 akr * lib/time.rb (Time.parse): "Fri Jan 1 08:59:60 +0900 1999" was
akr authored
771 t += 1
19813ca akr add tests for leapseconds on an environment without leapseconds support.
akr authored
772 assert_equal(t, Time.xmlschema("1998-12-31T23:59:60Z"))
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
773 assert_equal(t, Time.xmlschema("1998-12-31T23:59:60-00:00"));t.localtime
19813ca akr add tests for leapseconds on an environment without leapseconds support.
akr authored
774 assert_equal(t, Time.xmlschema("1999-01-01T08:59:60+09:00"))
775 assert_equal(t, Time.xmlschema("1999-01-01T00:59:60+01:00"))
776 assert_equal(t, Time.xmlschema("1998-12-31T23:59:60+00:00"))
04c65aa akr * lib/time.rb (Time.parse): fix previous leap seconds support.
akr authored
777 assert_equal(t, Time.xmlschema("1998-12-31T22:59:60-01:00"));t.utc
778 t += 1 if t.sec == 60
779 assert_equal(t, Time.xmlschema("1999-01-01T00:00:00Z"))
780 assert_equal(t, Time.xmlschema("1999-01-01T00:00:00-00:00"));t.localtime
781 assert_equal(t, Time.xmlschema("1999-01-01T09:00:00+09:00"))
782 assert_equal(t, Time.xmlschema("1999-01-01T01:00:00+01:00"))
783 assert_equal(t, Time.xmlschema("1999-01-01T00:00:00+00:00"))
784 assert_equal(t, Time.xmlschema("1998-12-31T23:00:00-01:00"))
dc2ad49 akr * lib/time.rb (Time.parse): "Fri Jan 1 08:59:60 +0900 1999" was
akr authored
785 end
eb97f7d akr * lib/time.rb (Time.apply_offset): fix a problem with last day of
akr authored
786
787 def test_ruby_talk_152866
788 t = Time::xmlschema('2005-08-30T22:48:00-07:00')
789 assert_equal(31, t.day)
790 assert_equal(8, t.mon)
791 end
d6187d5 akr * lib/time.rb (Time.parse): extract fractional seconds using
akr authored
792
793 def test_parse_fraction
794 assert_equal(500000, Time.parse("2000-01-01T00:00:00.5+00:00").tv_usec)
795 end
dc2ad49 akr * lib/time.rb (Time.parse): "Fri Jan 1 08:59:60 +0900 1999" was
akr authored
796 end
ff1027d akr new file.
akr authored
797 end
Something went wrong with that request. Please try again.