rubysl-time 1.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f7d3e6821ee1fe3334182e7a064308c72b9dfacb
4
- data.tar.gz: d68ac18351fda6e3e29cb32368fb34d7b01a8916
3
+ metadata.gz: 22ecb11d60dd66b66a2d6cbf65ee0e454fa83b69
4
+ data.tar.gz: 2f99b4a151ee5f0cc92758e778bc588fb8605cd7
5
5
  SHA512:
6
- metadata.gz: fd375cb1994ca2c22f784bf3b886e62d74efde8589816017a38bb03d42ab11c1926ba50020b457e69adfb6e66ba5d880aad341b00ab7a9164953d5111547afc2
7
- data.tar.gz: 48a1bb0c79d29e72ab7c11d848faa4ff6afcc8717a15766818bf03af684af870c094813233f278c4df651f9e2f3d4c62181a69598cd207aefbb98ba6fd4040e9
6
+ metadata.gz: 8d9e9c4d7d52ff61fe4ff13b289147b5742d6e6938c880f4781d20f9ab320dc0ea9cf24269dfdecc09c5bd2d570f8eecf2bf3ed6a35810c34153ef42e8d9c760
7
+ data.tar.gz: 89278f56d1ae5574f53542d2da0d9f4cbac1240569e99f10e4cdbe31dd316f73bf63cca28a2c0924c159fe217aafb66c8baafc38fbc9ff29002c0094887ce305
@@ -1,7 +1,9 @@
1
1
  language: ruby
2
+ before_install:
3
+ - rvm use $RVM --install --binary --fuzzy
4
+ - gem update --system
5
+ - gem --version
6
+ - gem install rubysl-bundler
2
7
  env:
3
- - RUBYLIB=lib
4
- script: bundle exec mspec
5
- rvm:
6
- - 1.8.7
7
- - rbx-nightly-18mode
8
+ - RVM=rbx-nightly-d21 RUBYLIB=lib
9
+ script: bundle exec mspec spec
@@ -1,55 +1,98 @@
1
+ require 'date'
1
2
 
3
+ # = time.rb
2
4
  #
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)
10
- # * various formats handled by Date._parse (string to time only)
11
- #
12
- # == Design Issues
13
- #
14
- # === Specialized interface
15
- #
16
- # This library provides methods dedicated to special purposes:
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.
5
+ # When 'time' is required, Time is extended with additional methods for parsing
6
+ # and converting Times.
37
7
  #
38
- # == Revision Information
8
+ # == Features
39
9
  #
40
- # $Id$
10
+ # This library extends the Time class with the following conversions between
11
+ # date strings and Time objects:
41
12
  #
42
-
43
- require 'parsedate'
44
-
13
+ # * date-time defined by {RFC 2822}[http://www.ietf.org/rfc/rfc2822.txt]
14
+ # * HTTP-date defined by {RFC 2616}[http://www.ietf.org/rfc/rfc2616.txt]
15
+ # * dateTime defined by XML Schema Part 2: Datatypes ({ISO
16
+ # 8601}[http://www.iso.org/iso/date_and_time_format])
17
+ # * various formats handled by Date._parse
18
+ # * custom formats handled by Date._strptime
19
+ #
20
+ # == Examples
21
+ #
22
+ # All examples assume you have loaded Time with:
23
+ #
24
+ # require 'time'
25
+ #
26
+ # All of these examples were done using the EST timezone which is GMT-5.
27
+ #
28
+ # === Converting to a String
29
+ #
30
+ # t = Time.now
31
+ # t.iso8601 # => "2011-10-05T22:26:12-04:00"
32
+ # t.rfc2822 # => "Wed, 05 Oct 2011 22:26:12 -0400"
33
+ # t.httpdate # => "Thu, 06 Oct 2011 02:26:12 GMT"
34
+ #
35
+ # === Time.parse
36
+ #
37
+ # #parse takes a string representation of a Time and attempts to parse it
38
+ # using a heuristic.
39
+ #
40
+ # Date.parse("2010-10-31") #=> 2010-10-31 00:00:00 -0500
41
+ #
42
+ # Any missing pieces of the date are inferred based on the current date.
43
+ #
44
+ # # assuming the current date is "2011-10-31"
45
+ # Time.parse("12:00") #=> 2011-10-31 12:00:00 -0500
46
+ #
47
+ # We can change the date used to infer our missing elements by passing a second
48
+ # object that responds to #mon, #day and #year, such as Date, Time or DateTime.
49
+ # We can also use our own object.
50
+ #
51
+ # class MyDate
52
+ # attr_reader :mon, :day, :year
45
53
  #
46
- # Implements the extensions to the Time class that are described in the
47
- # documentation for the time.rb library.
54
+ # def initialize(mon, day, year)
55
+ # @mon, @day, @year = mon, day, year
56
+ # end
57
+ # end
48
58
  #
59
+ # d = Date.parse("2010-10-28")
60
+ # t = Time.parse("2010-10-29")
61
+ # dt = DateTime.parse("2010-10-30")
62
+ # md = MyDate.new(10,31,2010)
63
+ #
64
+ # Time.parse("12:00", d) #=> 2010-10-28 12:00:00 -0500
65
+ # Time.parse("12:00", t) #=> 2010-10-29 12:00:00 -0500
66
+ # Time.parse("12:00", dt) #=> 2010-10-30 12:00:00 -0500
67
+ # Time.parse("12:00", md) #=> 2010-10-31 12:00:00 -0500
68
+ #
69
+ # #parse also accepts an optional block. You can use this block to specify how
70
+ # to handle the year component of the date. This is specifically designed for
71
+ # handling two digit years. For example, if you wanted to treat all two digit
72
+ # years prior to 70 as the year 2000+ you could write this:
73
+ #
74
+ # Time.parse("01-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
75
+ # #=> 2001-10-31 00:00:00 -0500
76
+ # Time.parse("70-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
77
+ # #=> 1970-10-31 00:00:00 -0500
78
+ #
79
+ # === Time.strptime
80
+ #
81
+ # #strptime works similar to +parse+ except that instead of using a heuristic
82
+ # to detect the format of the input string, you provide a second argument that
83
+ # is describes the format of the string. For example:
84
+ #
85
+ # Time.strptime("2000-10-31", "%Y-%m-%d") #=> 2000-10-31 00:00:00 -0500
86
+
49
87
  class Time
50
88
  class << Time
51
89
 
52
- ZoneOffset = {
90
+ #
91
+ # A hash of timezones mapped to hour differences from UTC. The
92
+ # set of time zones corresponds to the ones specified by RFC 2822
93
+ # and ISO 8601.
94
+ #
95
+ ZoneOffset = { # :nodoc:
53
96
  'UTC' => 0,
54
97
  # ISO 8601
55
98
  'Z' => 0,
@@ -61,11 +104,31 @@ class Time
61
104
  'PST' => -8, 'PDT' => -7,
62
105
  # Following definition of military zones is original one.
63
106
  # See RFC 1123 and RFC 2822 for the error in RFC 822.
64
- 'A' => +1, 'B' => +2, 'C' => +3, 'D' => +4, 'E' => +5, 'F' => +6,
107
+ 'A' => +1, 'B' => +2, 'C' => +3, 'D' => +4, 'E' => +5, 'F' => +6,
65
108
  '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,
109
+ 'N' => -1, 'O' => -2, 'P' => -3, 'Q' => -4, 'R' => -5, 'S' => -6,
67
110
  'T' => -7, 'U' => -8, 'V' => -9, 'W' => -10, 'X' => -11, 'Y' => -12,
68
111
  }
112
+
113
+ #
114
+ # Return the number of seconds the specified time zone differs
115
+ # from UTC.
116
+ #
117
+ # Numeric time zones that include minutes, such as
118
+ # <code>-10:00</code> or <code>+1330</code> will work, as will
119
+ # simpler hour-only time zones like <code>-10</code> or
120
+ # <code>+13</code>.
121
+ #
122
+ # Textual time zones listed in ZoneOffset are also supported.
123
+ #
124
+ # If the time zone does not match any of the above, +zone_offset+
125
+ # will check if the local time zone (both with and without
126
+ # potential Daylight Saving \Time changes being in effect) matches
127
+ # +zone+. Specifying a value for +year+ will change the year used
128
+ # to find the local time zone.
129
+ #
130
+ # If +zone_offset+ is unable to determine the offset, nil will be
131
+ # returned.
69
132
  def zone_offset(zone, year=self.now.year)
70
133
  off = nil
71
134
  zone = zone.upcase
@@ -84,8 +147,25 @@ class Time
84
147
  end
85
148
 
86
149
  def zone_utc?(zone)
87
- # * +0000 means localtime. [RFC 2822]
88
- # * GMT is a localtime abbreviation in Europe/London, etc.
150
+ # * +0000
151
+ # In RFC 2822, +0000 indicate a time zone at Universal Time.
152
+ # Europe/Lisbon is "a time zone at Universal Time" in Winter.
153
+ # Atlantic/Reykjavik is "a time zone at Universal Time".
154
+ # Africa/Dakar is "a time zone at Universal Time".
155
+ # So +0000 is a local time such as Europe/London, etc.
156
+ # * GMT
157
+ # GMT is used as a time zone abbreviation in Europe/London,
158
+ # Africa/Dakar, etc.
159
+ # So it is a local time.
160
+ #
161
+ # * -0000, -00:00
162
+ # In RFC 2822, -0000 the date-time contains no information about the
163
+ # local time zone.
164
+ # In RFC 3339, -00:00 is used for the time in UTC is known,
165
+ # but the offset to local time is unknown.
166
+ # They are not appropriate for specific time zone such as
167
+ # Europe/London because time zone neutral,
168
+ # So -00:00 and -0000 are treated as UTC.
89
169
  if /\A(?:-00:00|-0000|-00|UTC|Z|UT)\z/i =~ zone
90
170
  true
91
171
  else
@@ -94,8 +174,8 @@ class Time
94
174
  end
95
175
  private :zone_utc?
96
176
 
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]
177
+ LeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # :nodoc:
178
+ CommonYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # :nodoc:
99
179
  def month_days(y, m)
100
180
  if ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)
101
181
  LeapYearMonthDays[m-1]
@@ -150,7 +230,7 @@ class Time
150
230
 
151
231
  def make_time(year, mon, day, hour, min, sec, sec_fraction, zone, now)
152
232
  usec = nil
153
- usec = (sec_fraction * 1000000).to_i if sec_fraction
233
+ usec = sec_fraction * 1000000 if sec_fraction
154
234
  if now
155
235
  begin
156
236
  break if year; year = now.year
@@ -192,20 +272,22 @@ class Time
192
272
  # If a block is given, the year described in +date+ is converted by the
193
273
  # block. For example:
194
274
  #
195
- # Time.parse(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
275
+ # Time.parse(...) {|y| 0 <= y && y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
196
276
  #
197
277
  # If the upper components of the given time are broken or missing, they are
198
278
  # supplied with those of +now+. For the lower components, the minimum
199
279
  # values (1 or 0) are assumed if broken or missing. For example:
200
280
  #
201
281
  # # 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
205
- # Time.parse("Aug 31") #=> Fri Aug 31 00:00:00 GMT 2001
282
+ # # your time zone is GMT:
283
+ # now = Time.parse("Thu Nov 29 14:33:20 GMT 2001")
284
+ # Time.parse("16:30", now) #=> 2001-11-29 16:30:00 +0900
285
+ # Time.parse("7/23", now) #=> 2001-07-23 00:00:00 +0900
286
+ # Time.parse("Aug 31", now) #=> 2001-08-31 00:00:00 +0900
287
+ # Time.parse("Aug 2000", now) #=> 2000-08-01 00:00:00 +0900
206
288
  #
207
- # Since there are numerous conflicts among locally defined timezone
208
- # abbreviations all over the world, this method is not made to
289
+ # Since there are numerous conflicts among locally defined time zone
290
+ # abbreviations all over the world, this method is not intended to
209
291
  # understand all of them. For example, the abbreviation "CST" is
210
292
  # used variously as:
211
293
  #
@@ -216,34 +298,114 @@ class Time
216
298
  # +10:30 in Australia/Adelaide,
217
299
  # etc.
218
300
  #
219
- # Based on the fact, this method only understands the timezone
220
- # abbreviations described in RFC 822 and the system timezone, in the
301
+ # Based on this fact, this method only understands the time zone
302
+ # abbreviations described in RFC 822 and the system time zone, in the
221
303
  # order named. (i.e. a definition in RFC 822 overrides the system
222
- # timezone definition.) The system timezone is taken from
304
+ # time zone definition.) The system time zone is taken from
223
305
  # <tt>Time.local(year, 1, 1).zone</tt> and
224
306
  # <tt>Time.local(year, 7, 1).zone</tt>.
225
- # If the extracted timezone abbreviation does not match any of them,
307
+ # If the extracted time zone abbreviation does not match any of them,
226
308
  # it is ignored and the given time is regarded as a local time.
227
309
  #
228
310
  # ArgumentError is raised if Date._parse cannot extract information from
229
- # +date+ or Time class cannot represent specified date.
311
+ # +date+ or if the Time class cannot represent specified date.
230
312
  #
231
- # This method can be used as fail-safe for other parsing methods as:
313
+ # This method can be used as a fail-safe for other parsing methods as:
232
314
  #
233
315
  # Time.rfc2822(date) rescue Time.parse(date)
234
316
  # Time.httpdate(date) rescue Time.parse(date)
235
317
  # Time.xmlschema(date) rescue Time.parse(date)
236
318
  #
237
- # A failure for Time.parse should be checked, though.
319
+ # A failure of Time.parse should be checked, though.
320
+ #
321
+ # You must require 'time' to use this method.
238
322
  #
239
323
  def parse(date, now=self.now)
240
- d = Date._parse(date, false, true)
241
- year = d.year
242
- year = yield(year) if year && block_given?
243
- make_time(year, d.mon, d.mday, d.hour, d.min, d.sec, d.sec_fraction, d.zone, now)
324
+ comp = !block_given?
325
+ d = Date._parse(date, comp)
326
+ if !d[:year] && !d[:mon] && !d[:mday] && !d[:hour] && !d[:min] && !d[:sec] && !d[:sec_fraction]
327
+ raise ArgumentError, "no time information in #{date.inspect}"
328
+ end
329
+ year = d[:year]
330
+ year = yield(year) if year && !comp
331
+ make_time(year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
332
+ end
333
+
334
+ #
335
+ # Parses +date+ using Date._strptime and converts it to a Time object.
336
+ #
337
+ # If a block is given, the year described in +date+ is converted by the
338
+ # block. For example:
339
+ #
340
+ # Time.strptime(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
341
+ #
342
+ # Below is a list of the formating options:
343
+ #
344
+ # %a :: The abbreviated weekday name ("Sun")
345
+ # %A :: The full weekday name ("Sunday")
346
+ # %b :: The abbreviated month name ("Jan")
347
+ # %B :: The full month name ("January")
348
+ # %c :: The preferred local date and time representation
349
+ # %C :: Century (20 in 2009)
350
+ # %d :: Day of the month (01..31)
351
+ # %D :: Date (%m/%d/%y)
352
+ # %e :: Day of the month, blank-padded ( 1..31)
353
+ # %F :: Equivalent to %Y-%m-%d (the ISO 8601 date format)
354
+ # %h :: Equivalent to %b
355
+ # %H :: Hour of the day, 24-hour clock (00..23)
356
+ # %I :: Hour of the day, 12-hour clock (01..12)
357
+ # %j :: Day of the year (001..366)
358
+ # %k :: hour, 24-hour clock, blank-padded ( 0..23)
359
+ # %l :: hour, 12-hour clock, blank-padded ( 0..12)
360
+ # %L :: Millisecond of the second (000..999)
361
+ # %m :: Month of the year (01..12)
362
+ # %M :: Minute of the hour (00..59)
363
+ # %n :: Newline (\n)
364
+ # %N :: Fractional seconds digits, default is 9 digits (nanosecond)
365
+ # %3N :: millisecond (3 digits)
366
+ # %6N :: microsecond (6 digits)
367
+ # %9N :: nanosecond (9 digits)
368
+ # %p :: Meridian indicator ("AM" or "PM")
369
+ # %P :: Meridian indicator ("am" or "pm")
370
+ # %r :: time, 12-hour (same as %I:%M:%S %p)
371
+ # %R :: time, 24-hour (%H:%M)
372
+ # %s :: Number of seconds since 1970-01-01 00:00:00 UTC.
373
+ # %S :: Second of the minute (00..60)
374
+ # %t :: Tab character (\t)
375
+ # %T :: time, 24-hour (%H:%M:%S)
376
+ # %u :: Day of the week as a decimal, Monday being 1. (1..7)
377
+ # %U :: Week number of the current year, starting with the first Sunday as
378
+ # the first day of the first week (00..53)
379
+ # %v :: VMS date (%e-%b-%Y)
380
+ # %V :: Week number of year according to ISO 8601 (01..53)
381
+ # %W :: Week number of the current year, starting with the first Monday
382
+ # as the first day of the first week (00..53)
383
+ # %w :: Day of the week (Sunday is 0, 0..6)
384
+ # %x :: Preferred representation for the date alone, no time
385
+ # %X :: Preferred representation for the time alone, no date
386
+ # %y :: Year without a century (00..99)
387
+ # %Y :: Year with century
388
+ # %z :: Time zone as hour offset from UTC (e.g. +0900)
389
+ # %Z :: Time zone name
390
+ # %% :: Literal "%" character
391
+
392
+ def strptime(date, format, now=self.now)
393
+ d = Date._strptime(date, format)
394
+ raise ArgumentError, "invalid strptime format - `#{format}'" unless d
395
+ if seconds = d[:seconds]
396
+ if offset = d[:offset]
397
+ Time.at(seconds).localtime(offset)
398
+ else
399
+ Time.at(seconds)
400
+ end
401
+ else
402
+ year = d[:year]
403
+ year = yield(year) if year && block_given?
404
+ make_time(year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
405
+ end
244
406
  end
245
407
 
246
- MonthValue = {
408
+ MonthValue = { # :nodoc:
247
409
  'JAN' => 1, 'FEB' => 2, 'MAR' => 3, 'APR' => 4, 'MAY' => 5, 'JUN' => 6,
248
410
  'JUL' => 7, 'AUG' => 8, 'SEP' => 9, 'OCT' =>10, 'NOV' =>11, 'DEC' =>12
249
411
  }
@@ -254,10 +416,12 @@ class Time
254
416
  # updated by RFC 1123.
255
417
  #
256
418
  # ArgumentError is raised if +date+ is not compliant with RFC 2822
257
- # or Time class cannot represent specified date.
419
+ # or if the Time class cannot represent specified date.
258
420
  #
259
421
  # See #rfc2822 for more information on this format.
260
422
  #
423
+ # You must require 'time' to use this method.
424
+ #
261
425
  def rfc2822(date)
262
426
  if /\A\s*
263
427
  (?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)?
@@ -299,14 +463,16 @@ class Time
299
463
  alias rfc822 rfc2822
300
464
 
301
465
  #
302
- # Parses +date+ as HTTP-date defined by RFC 2616 and converts it to a Time
303
- # object.
466
+ # Parses +date+ as an HTTP-date defined by RFC 2616 and converts it to a
467
+ # Time object.
304
468
  #
305
- # ArgumentError is raised if +date+ is not compliant with RFC 2616 or Time
306
- # class cannot represent specified date.
469
+ # ArgumentError is raised if +date+ is not compliant with RFC 2616 or if
470
+ # the Time class cannot represent specified date.
307
471
  #
308
472
  # See #httpdate for more information on this format.
309
473
  #
474
+ # You must require 'time' to use this method.
475
+ #
310
476
  def httpdate(date)
311
477
  if /\A\s*
312
478
  (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\x20
@@ -323,7 +489,13 @@ class Time
323
489
  (\d\d):(\d\d):(\d\d)\x20
324
490
  GMT
325
491
  \s*\z/ix =~ date
326
- self.parse(date)
492
+ year = $3.to_i
493
+ if year < 50
494
+ year += 2000
495
+ else
496
+ year += 1900
497
+ end
498
+ self.utc(year, $2, $1.to_i, $4.to_i, $5.to_i, $6.to_i)
327
499
  elsif /\A\s*
328
500
  (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\x20
329
501
  (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
@@ -339,21 +511,23 @@ class Time
339
511
  end
340
512
 
341
513
  #
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.
514
+ # Parses +date+ as a dateTime defined by the XML Schema and converts it to
515
+ # a Time object. The format is a restricted version of the format defined
516
+ # by ISO 8601.
345
517
  #
346
- # ArgumentError is raised if +date+ is not compliant with the format or Time
347
- # class cannot represent specified date.
518
+ # ArgumentError is raised if +date+ is not compliant with the format or if
519
+ # the Time class cannot represent specified date.
348
520
  #
349
521
  # See #xmlschema for more information on this format.
350
522
  #
523
+ # You must require 'time' to use this method.
524
+ #
351
525
  def xmlschema(date)
352
526
  if /\A\s*
353
527
  (-?\d+)-(\d\d)-(\d\d)
354
528
  T
355
529
  (\d\d):(\d\d):(\d\d)
356
- (\.\d*)?
530
+ (\.\d+)?
357
531
  (Z|[+-]\d\d:\d\d)?
358
532
  \s*\z/ix =~ date
359
533
  year = $1.to_i
@@ -363,7 +537,9 @@ class Time
363
537
  min = $5.to_i
364
538
  sec = $6.to_i
365
539
  usec = 0
366
- usec = ($7[1..-1] + '000000')[0,6].to_i if $7
540
+ if $7
541
+ usec = Rational($7) * 1000000
542
+ end
367
543
  if $8
368
544
  zone = $8
369
545
  year, mon, day, hour, min, sec =
@@ -388,10 +564,12 @@ class Time
388
564
  #
389
565
  # If +self+ is a UTC time, -0000 is used as zone.
390
566
  #
567
+ # You must require 'time' to use this method.
568
+ #
391
569
  def rfc2822
392
- sprintf('%s, %02d %s %d %02d:%02d:%02d ',
570
+ sprintf('%s, %02d %s %0*d %02d:%02d:%02d ',
393
571
  RFC2822_DAY_NAME[wday],
394
- day, RFC2822_MONTH_NAME[mon-1], year,
572
+ day, RFC2822_MONTH_NAME[mon-1], year < 0 ? 5 : 4, year,
395
573
  hour, min, sec) +
396
574
  if utc?
397
575
  '-0000'
@@ -403,62 +581,36 @@ class Time
403
581
  end
404
582
  alias rfc822 rfc2822
405
583
 
406
- RFC2822_DAY_NAME = [
584
+
585
+ RFC2822_DAY_NAME = [ # :nodoc:
407
586
  'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
408
587
  ]
409
- RFC2822_MONTH_NAME = [
588
+
589
+ RFC2822_MONTH_NAME = [ # :nodoc:
410
590
  'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
411
591
  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
412
592
  ]
413
593
 
414
594
  #
415
- # Returns a string which represents the time as rfc1123-date of HTTP-date
416
- # defined by RFC 2616:
417
- #
595
+ # Returns a string which represents the time as RFC 1123 date of HTTP-date
596
+ # defined by RFC 2616:
597
+ #
418
598
  # day-of-week, DD month-name CCYY hh:mm:ss GMT
419
599
  #
420
600
  # Note that the result is always UTC (GMT).
421
601
  #
602
+ # You must require 'time' to use this method.
603
+ #
422
604
  def httpdate
423
605
  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
-
429
- day = t.day
430
- if day < 10
431
- day = "0#{day}"
432
- else
433
- day = day.to_s
434
- end
435
-
436
- hour = t.hour
437
- if hour < 10
438
- hour = "0#{hour}"
439
- else
440
- hour = hour.to_s
441
- end
442
-
443
- min = t.min
444
- if min < 10
445
- min = "0#{min}"
446
- else
447
- min = min.to_s
448
- end
449
-
450
- sec = t.sec
451
- if sec < 10
452
- sec = "0#{sec}"
453
- else
454
- sec = sec.to_s
455
- end
456
-
457
- "#{RFC2822_DAY_NAME[t.wday]}, #{day} #{RFC2822_MONTH_NAME[t.mon-1]} #{t.year} #{hour}:#{min}:#{sec} GMT"
606
+ sprintf('%s, %02d %s %0*d %02d:%02d:%02d GMT',
607
+ RFC2822_DAY_NAME[t.wday],
608
+ t.day, RFC2822_MONTH_NAME[t.mon-1], t.year < 0 ? 5 : 4, t.year,
609
+ t.hour, t.min, t.sec)
458
610
  end
459
611
 
460
612
  #
461
- # Returns a string which represents the time as dateTime defined by XML
613
+ # Returns a string which represents the time as a dateTime defined by XML
462
614
  # Schema:
463
615
  #
464
616
  # CCYY-MM-DDThh:mm:ssTZD
@@ -468,362 +620,19 @@ class Time
468
620
  #
469
621
  # If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise.
470
622
  #
471
- # +fractional_seconds+ specifies a number of digits of fractional seconds.
472
- # Its default value is 0.
623
+ # +fractional_digits+ specifies a number of digits to use for fractional
624
+ # seconds. Its default value is 0.
625
+ #
626
+ # You must require 'time' to use this method.
473
627
  #
474
628
  def xmlschema(fraction_digits=0)
475
- sprintf('%d-%02d-%02dT%02d:%02d:%02d',
476
- year, mon, day, hour, min, sec) +
477
- if fraction_digits == 0
478
- ''
479
- elsif fraction_digits <= 6
480
- '.' + sprintf('%06d', usec)[0, fraction_digits]
481
- else
482
- '.' + sprintf('%06d', usec) + '0' * (fraction_digits - 6)
483
- end +
484
- if utc?
485
- 'Z'
486
- else
487
- off = utc_offset
488
- sign = off < 0 ? '-' : '+'
489
- sprintf('%s%02d:%02d', sign, *(off.abs / 60).divmod(60))
629
+ fraction_digits = fraction_digits.to_i
630
+ s = strftime("%FT%T")
631
+ if fraction_digits > 0
632
+ s << strftime(".%#{fraction_digits}N")
490
633
  end
634
+ s << (utc? ? 'Z' : strftime("%:z"))
491
635
  end
492
636
  alias iso8601 xmlschema
493
637
  end
494
638
 
495
- if __FILE__ == $0
496
- require 'test/unit'
497
-
498
- class TimeExtentionTest < Test::Unit::TestCase # :nodoc:
499
- def test_rfc822
500
- assert_equal(Time.utc(1976, 8, 26, 14, 30) + 4 * 3600,
501
- Time.rfc2822("26 Aug 76 14:30 EDT"))
502
- assert_equal(Time.utc(1976, 8, 27, 9, 32) + 7 * 3600,
503
- Time.rfc2822("27 Aug 76 09:32 PDT"))
504
- end
505
-
506
- def test_rfc2822
507
- assert_equal(Time.utc(1997, 11, 21, 9, 55, 6) + 6 * 3600,
508
- Time.rfc2822("Fri, 21 Nov 1997 09:55:06 -0600"))
509
- assert_equal(Time.utc(2003, 7, 1, 10, 52, 37) - 2 * 3600,
510
- Time.rfc2822("Tue, 1 Jul 2003 10:52:37 +0200"))
511
- assert_equal(Time.utc(1997, 11, 21, 10, 1, 10) + 6 * 3600,
512
- Time.rfc2822("Fri, 21 Nov 1997 10:01:10 -0600"))
513
- assert_equal(Time.utc(1997, 11, 21, 11, 0, 0) + 6 * 3600,
514
- Time.rfc2822("Fri, 21 Nov 1997 11:00:00 -0600"))
515
- assert_equal(Time.utc(1997, 11, 24, 14, 22, 1) + 8 * 3600,
516
- Time.rfc2822("Mon, 24 Nov 1997 14:22:01 -0800"))
517
- begin
518
- Time.at(-1)
519
- rescue ArgumentError
520
- # ignore
521
- else
522
- assert_equal(Time.utc(1969, 2, 13, 23, 32, 54) + 3 * 3600 + 30 * 60,
523
- Time.rfc2822("Thu, 13 Feb 1969 23:32:54 -0330"))
524
- assert_equal(Time.utc(1969, 2, 13, 23, 32, 0) + 3 * 3600 + 30 * 60,
525
- Time.rfc2822(" Thu,
526
- 13
527
- Feb
528
- 1969
529
- 23:32
530
- -0330 (Newfoundland Time)"))
531
- end
532
- assert_equal(Time.utc(1997, 11, 21, 9, 55, 6),
533
- Time.rfc2822("21 Nov 97 09:55:06 GMT"))
534
- assert_equal(Time.utc(1997, 11, 21, 9, 55, 6) + 6 * 3600,
535
- Time.rfc2822("Fri, 21 Nov 1997 09 : 55 : 06 -0600"))
536
- assert_raise(ArgumentError) {
537
- # inner comment is not supported.
538
- Time.rfc2822("Fri, 21 Nov 1997 09(comment): 55 : 06 -0600")
539
- }
540
- end
541
-
542
- def test_rfc2616
543
- t = Time.utc(1994, 11, 6, 8, 49, 37)
544
- assert_equal(t, Time.httpdate("Sun, 06 Nov 1994 08:49:37 GMT"))
545
- assert_equal(t, Time.httpdate("Sunday, 06-Nov-94 08:49:37 GMT"))
546
- assert_equal(t, Time.httpdate("Sun Nov 6 08:49:37 1994"))
547
- assert_equal(Time.utc(1995, 11, 15, 6, 25, 24),
548
- Time.httpdate("Wed, 15 Nov 1995 06:25:24 GMT"))
549
- assert_equal(Time.utc(1995, 11, 15, 4, 58, 8),
550
- Time.httpdate("Wed, 15 Nov 1995 04:58:08 GMT"))
551
- assert_equal(Time.utc(1994, 11, 15, 8, 12, 31),
552
- Time.httpdate("Tue, 15 Nov 1994 08:12:31 GMT"))
553
- assert_equal(Time.utc(1994, 12, 1, 16, 0, 0),
554
- Time.httpdate("Thu, 01 Dec 1994 16:00:00 GMT"))
555
- assert_equal(Time.utc(1994, 10, 29, 19, 43, 31),
556
- Time.httpdate("Sat, 29 Oct 1994 19:43:31 GMT"))
557
- assert_equal(Time.utc(1994, 11, 15, 12, 45, 26),
558
- Time.httpdate("Tue, 15 Nov 1994 12:45:26 GMT"))
559
- assert_equal(Time.utc(1999, 12, 31, 23, 59, 59),
560
- Time.httpdate("Fri, 31 Dec 1999 23:59:59 GMT"))
561
- end
562
-
563
- def test_rfc3339
564
- t = Time.utc(1985, 4, 12, 23, 20, 50, 520000)
565
- s = "1985-04-12T23:20:50.52Z"
566
- assert_equal(t, Time.iso8601(s))
567
- assert_equal(s, t.iso8601(2))
568
-
569
- t = Time.utc(1996, 12, 20, 0, 39, 57)
570
- s = "1996-12-19T16:39:57-08:00"
571
- assert_equal(t, Time.iso8601(s))
572
- # There is no way to generate time string with arbitrary timezone.
573
- s = "1996-12-20T00:39:57Z"
574
- assert_equal(t, Time.iso8601(s))
575
- assert_equal(s, t.iso8601)
576
-
577
- t = Time.utc(1990, 12, 31, 23, 59, 60)
578
- s = "1990-12-31T23:59:60Z"
579
- assert_equal(t, Time.iso8601(s))
580
- # leap second is representable only if timezone file has it.
581
- s = "1990-12-31T15:59:60-08:00"
582
- assert_equal(t, Time.iso8601(s))
583
-
584
- begin
585
- Time.at(-1)
586
- rescue ArgumentError
587
- # ignore
588
- else
589
- t = Time.utc(1937, 1, 1, 11, 40, 27, 870000)
590
- s = "1937-01-01T12:00:27.87+00:20"
591
- assert_equal(t, Time.iso8601(s))
592
- end
593
- end
594
-
595
- # http://www.w3.org/TR/xmlschema-2/
596
- def test_xmlschema
597
- assert_equal(Time.utc(1999, 5, 31, 13, 20, 0) + 5 * 3600,
598
- Time.xmlschema("1999-05-31T13:20:00-05:00"))
599
- assert_equal(Time.local(2000, 1, 20, 12, 0, 0),
600
- Time.xmlschema("2000-01-20T12:00:00"))
601
- assert_equal(Time.utc(2000, 1, 20, 12, 0, 0),
602
- Time.xmlschema("2000-01-20T12:00:00Z"))
603
- assert_equal(Time.utc(2000, 1, 20, 12, 0, 0) - 12 * 3600,
604
- Time.xmlschema("2000-01-20T12:00:00+12:00"))
605
- assert_equal(Time.utc(2000, 1, 20, 12, 0, 0) + 13 * 3600,
606
- Time.xmlschema("2000-01-20T12:00:00-13:00"))
607
- assert_equal(Time.utc(2000, 3, 4, 23, 0, 0) - 3 * 3600,
608
- Time.xmlschema("2000-03-04T23:00:00+03:00"))
609
- assert_equal(Time.utc(2000, 3, 4, 20, 0, 0),
610
- Time.xmlschema("2000-03-04T20:00:00Z"))
611
- assert_equal(Time.local(2000, 1, 15, 0, 0, 0),
612
- Time.xmlschema("2000-01-15T00:00:00"))
613
- assert_equal(Time.local(2000, 2, 15, 0, 0, 0),
614
- Time.xmlschema("2000-02-15T00:00:00"))
615
- assert_equal(Time.local(2000, 1, 15, 12, 0, 0),
616
- Time.xmlschema("2000-01-15T12:00:00"))
617
- assert_equal(Time.utc(2000, 1, 16, 12, 0, 0),
618
- Time.xmlschema("2000-01-16T12:00:00Z"))
619
- assert_equal(Time.local(2000, 1, 1, 12, 0, 0),
620
- Time.xmlschema("2000-01-01T12:00:00"))
621
- assert_equal(Time.utc(1999, 12, 31, 23, 0, 0),
622
- Time.xmlschema("1999-12-31T23:00:00Z"))
623
- assert_equal(Time.local(2000, 1, 16, 12, 0, 0),
624
- Time.xmlschema("2000-01-16T12:00:00"))
625
- assert_equal(Time.local(2000, 1, 16, 0, 0, 0),
626
- Time.xmlschema("2000-01-16T00:00:00"))
627
- assert_equal(Time.utc(2000, 1, 12, 12, 13, 14),
628
- Time.xmlschema("2000-01-12T12:13:14Z"))
629
- assert_equal(Time.utc(2001, 4, 17, 19, 23, 17, 300000),
630
- Time.xmlschema("2001-04-17T19:23:17.3Z"))
631
- end
632
-
633
- def test_encode_xmlschema
634
- t = Time.utc(2001, 4, 17, 19, 23, 17, 300000)
635
- assert_equal("2001-04-17T19:23:17Z", t.xmlschema)
636
- assert_equal("2001-04-17T19:23:17.3Z", t.xmlschema(1))
637
- assert_equal("2001-04-17T19:23:17.300000Z", t.xmlschema(6))
638
- assert_equal("2001-04-17T19:23:17.3000000Z", t.xmlschema(7))
639
-
640
- t = Time.utc(2001, 4, 17, 19, 23, 17, 123456)
641
- assert_equal("2001-04-17T19:23:17.1234560Z", t.xmlschema(7))
642
- assert_equal("2001-04-17T19:23:17.123456Z", t.xmlschema(6))
643
- assert_equal("2001-04-17T19:23:17.12345Z", t.xmlschema(5))
644
- assert_equal("2001-04-17T19:23:17.1Z", t.xmlschema(1))
645
-
646
- begin
647
- Time.at(-1)
648
- rescue ArgumentError
649
- # ignore
650
- else
651
- t = Time.utc(1960, 12, 31, 23, 0, 0, 123456)
652
- assert_equal("1960-12-31T23:00:00.123456Z", t.xmlschema(6))
653
- end
654
-
655
- assert_equal(249, Time.xmlschema("2008-06-05T23:49:23.000249+09:00").usec)
656
- end
657
-
658
- def test_completion
659
- now = Time.local(2001,11,29,21,26,35)
660
- assert_equal(Time.local( 2001,11,29,21,12),
661
- Time.parse("2001/11/29 21:12", now))
662
- assert_equal(Time.local( 2001,11,29),
663
- Time.parse("2001/11/29", now))
664
- assert_equal(Time.local( 2001,11,29),
665
- Time.parse( "11/29", now))
666
- #assert_equal(Time.local(2001,11,1), Time.parse("Nov", now))
667
- assert_equal(Time.local( 2001,11,29,10,22),
668
- Time.parse( "10:22", now))
669
- end
670
-
671
- def test_invalid
672
- # They were actually used in some web sites.
673
- assert_raise(ArgumentError) { Time.httpdate("1 Dec 2001 10:23:57 GMT") }
674
- assert_raise(ArgumentError) { Time.httpdate("Sat, 1 Dec 2001 10:25:42 GMT") }
675
- assert_raise(ArgumentError) { Time.httpdate("Sat, 1-Dec-2001 10:53:55 GMT") }
676
- assert_raise(ArgumentError) { Time.httpdate("Saturday, 01-Dec-2001 10:15:34 GMT") }
677
- assert_raise(ArgumentError) { Time.httpdate("Saturday, 01-Dec-101 11:10:07 GMT") }
678
- assert_raise(ArgumentError) { Time.httpdate("Fri, 30 Nov 2001 21:30:00 JST") }
679
-
680
- # They were actually used in some mails.
681
- assert_raise(ArgumentError) { Time.rfc2822("01-5-20") }
682
- assert_raise(ArgumentError) { Time.rfc2822("7/21/00") }
683
- assert_raise(ArgumentError) { Time.rfc2822("2001-8-28") }
684
- assert_raise(ArgumentError) { Time.rfc2822("00-5-6 1:13:06") }
685
- assert_raise(ArgumentError) { Time.rfc2822("2001-9-27 9:36:49") }
686
- assert_raise(ArgumentError) { Time.rfc2822("2000-12-13 11:01:11") }
687
- assert_raise(ArgumentError) { Time.rfc2822("2001/10/17 04:29:55") }
688
- assert_raise(ArgumentError) { Time.rfc2822("9/4/2001 9:23:19 PM") }
689
- assert_raise(ArgumentError) { Time.rfc2822("01 Nov 2001 09:04:31") }
690
- assert_raise(ArgumentError) { Time.rfc2822("13 Feb 2001 16:4 GMT") }
691
- assert_raise(ArgumentError) { Time.rfc2822("01 Oct 00 5:41:19 PM") }
692
- assert_raise(ArgumentError) { Time.rfc2822("2 Jul 00 00:51:37 JST") }
693
- assert_raise(ArgumentError) { Time.rfc2822("01 11 2001 06:55:57 -0500") }
694
- assert_raise(ArgumentError) { Time.rfc2822("18 \343\366\356\341\370 2000") }
695
- assert_raise(ArgumentError) { Time.rfc2822("Fri, Oct 2001 18:53:32") }
696
- assert_raise(ArgumentError) { Time.rfc2822("Fri, 2 Nov 2001 03:47:54") }
697
- assert_raise(ArgumentError) { Time.rfc2822("Fri, 27 Jul 2001 11.14.14 +0200") }
698
- assert_raise(ArgumentError) { Time.rfc2822("Thu, 2 Nov 2000 04:13:53 -600") }
699
- assert_raise(ArgumentError) { Time.rfc2822("Wed, 5 Apr 2000 22:57:09 JST") }
700
- assert_raise(ArgumentError) { Time.rfc2822("Mon, 11 Sep 2000 19:47:33 00000") }
701
- assert_raise(ArgumentError) { Time.rfc2822("Fri, 28 Apr 2000 20:40:47 +-900") }
702
- assert_raise(ArgumentError) { Time.rfc2822("Fri, 19 Jan 2001 8:15:36 AM -0500") }
703
- assert_raise(ArgumentError) { Time.rfc2822("Thursday, Sep 27 2001 7:42:35 AM EST") }
704
- assert_raise(ArgumentError) { Time.rfc2822("3/11/2001 1:31:57 PM Pacific Daylight Time") }
705
- assert_raise(ArgumentError) { Time.rfc2822("Mi, 28 Mrz 2001 11:51:36") }
706
- assert_raise(ArgumentError) { Time.rfc2822("P, 30 sept 2001 23:03:14") }
707
- assert_raise(ArgumentError) { Time.rfc2822("fr, 11 aug 2000 18:39:22") }
708
- assert_raise(ArgumentError) { Time.rfc2822("Fr, 21 Sep 2001 17:44:03 -1000") }
709
- assert_raise(ArgumentError) { Time.rfc2822("Mo, 18 Jun 2001 19:21:40 -1000") }
710
- assert_raise(ArgumentError) { Time.rfc2822("l\366, 12 aug 2000 18:53:20") }
711
- assert_raise(ArgumentError) { Time.rfc2822("l\366, 26 maj 2001 00:15:58") }
712
- assert_raise(ArgumentError) { Time.rfc2822("Dom, 30 Sep 2001 17:36:30") }
713
- assert_raise(ArgumentError) { Time.rfc2822("%&, 31 %2/ 2000 15:44:47 -0500") }
714
- assert_raise(ArgumentError) { Time.rfc2822("dom, 26 ago 2001 03:57:07 -0300") }
715
- assert_raise(ArgumentError) { Time.rfc2822("ter, 04 set 2001 16:27:58 -0300") }
716
- assert_raise(ArgumentError) { Time.rfc2822("Wen, 3 oct 2001 23:17:49 -0400") }
717
- assert_raise(ArgumentError) { Time.rfc2822("Wen, 3 oct 2001 23:17:49 -0400") }
718
- assert_raise(ArgumentError) { Time.rfc2822("ele, 11 h: 2000 12:42:15 -0500") }
719
- assert_raise(ArgumentError) { Time.rfc2822("Tue, 14 Aug 2001 3:55:3 +0200") }
720
- assert_raise(ArgumentError) { Time.rfc2822("Fri, 25 Aug 2000 9:3:48 +0800") }
721
- assert_raise(ArgumentError) { Time.rfc2822("Fri, 1 Dec 2000 0:57:50 EST") }
722
- assert_raise(ArgumentError) { Time.rfc2822("Mon, 7 May 2001 9:39:51 +0200") }
723
- assert_raise(ArgumentError) { Time.rfc2822("Wed, 1 Aug 2001 16:9:15 +0200") }
724
- assert_raise(ArgumentError) { Time.rfc2822("Wed, 23 Aug 2000 9:17:36 +0800") }
725
- assert_raise(ArgumentError) { Time.rfc2822("Fri, 11 Aug 2000 10:4:42 +0800") }
726
- assert_raise(ArgumentError) { Time.rfc2822("Sat, 15 Sep 2001 13:22:2 +0300") }
727
- assert_raise(ArgumentError) { Time.rfc2822("Wed,16 \276\305\324\302 2001 20:06:25 +0800") }
728
- assert_raise(ArgumentError) { Time.rfc2822("Wed,7 \312\256\322\273\324\302 2001 23:47:22 +0800") }
729
- assert_raise(ArgumentError) { Time.rfc2822("=?iso-8859-1?Q?(=C5=DA),?= 10 2 2001 23:32:26 +0900 (JST)") }
730
- assert_raise(ArgumentError) { Time.rfc2822("\307\341\314\343\332\311, 30 \344\346\335\343\310\321 2001 10:01:06") }
731
- 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)") }
732
- end
733
-
734
- def test_zone_0000
735
- assert_equal(true, Time.parse("2000-01-01T00:00:00Z").utc?)
736
- assert_equal(true, Time.parse("2000-01-01T00:00:00-00:00").utc?)
737
- assert_equal(false, Time.parse("2000-01-01T00:00:00+00:00").utc?)
738
- assert_equal(false, Time.parse("Sat, 01 Jan 2000 00:00:00 GMT").utc?)
739
- assert_equal(true, Time.parse("Sat, 01 Jan 2000 00:00:00 -0000").utc?)
740
- assert_equal(false, Time.parse("Sat, 01 Jan 2000 00:00:00 +0000").utc?)
741
- assert_equal(false, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 GMT").utc?)
742
- assert_equal(true, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 -0000").utc?)
743
- assert_equal(false, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 +0000").utc?)
744
- assert_equal(true, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 UTC").utc?)
745
- end
746
-
747
- def test_parse_leap_second
748
- t = Time.utc(1998,12,31,23,59,59)
749
- assert_equal(t, Time.parse("Thu Dec 31 23:59:59 UTC 1998"))
750
- assert_equal(t, Time.parse("Fri Dec 31 23:59:59 -0000 1998"));t.localtime
751
- assert_equal(t, Time.parse("Fri Jan 1 08:59:59 +0900 1999"))
752
- assert_equal(t, Time.parse("Fri Jan 1 00:59:59 +0100 1999"))
753
- assert_equal(t, Time.parse("Fri Dec 31 23:59:59 +0000 1998"))
754
- assert_equal(t, Time.parse("Fri Dec 31 22:59:59 -0100 1998"));t.utc
755
- t += 1
756
- assert_equal(t, Time.parse("Thu Dec 31 23:59:60 UTC 1998"))
757
- assert_equal(t, Time.parse("Fri Dec 31 23:59:60 -0000 1998"));t.localtime
758
- assert_equal(t, Time.parse("Fri Jan 1 08:59:60 +0900 1999"))
759
- assert_equal(t, Time.parse("Fri Jan 1 00:59:60 +0100 1999"))
760
- assert_equal(t, Time.parse("Fri Dec 31 23:59:60 +0000 1998"))
761
- assert_equal(t, Time.parse("Fri Dec 31 22:59:60 -0100 1998"));t.utc
762
- t += 1 if t.sec == 60
763
- assert_equal(t, Time.parse("Thu Jan 1 00:00:00 UTC 1999"))
764
- assert_equal(t, Time.parse("Fri Jan 1 00:00:00 -0000 1999"));t.localtime
765
- assert_equal(t, Time.parse("Fri Jan 1 09:00:00 +0900 1999"))
766
- assert_equal(t, Time.parse("Fri Jan 1 01:00:00 +0100 1999"))
767
- assert_equal(t, Time.parse("Fri Jan 1 00:00:00 +0000 1999"))
768
- assert_equal(t, Time.parse("Fri Dec 31 23:00:00 -0100 1998"))
769
- end
770
-
771
- def test_rfc2822_leap_second
772
- t = Time.utc(1998,12,31,23,59,59)
773
- assert_equal(t, Time.rfc2822("Thu, 31 Dec 1998 23:59:59 UTC"))
774
- assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:59 -0000"));t.localtime
775
- assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 08:59:59 +0900"))
776
- assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:59:59 +0100"))
777
- assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:59 +0000"))
778
- assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 22:59:59 -0100"));t.utc
779
- t += 1
780
- assert_equal(t, Time.rfc2822("Thu, 31 Dec 1998 23:59:60 UTC"))
781
- assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:60 -0000"));t.localtime
782
- assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 08:59:60 +0900"))
783
- assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:59:60 +0100"))
784
- assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:60 +0000"))
785
- assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 22:59:60 -0100"));t.utc
786
- t += 1 if t.sec == 60
787
- assert_equal(t, Time.rfc2822("Thu, 1 Jan 1999 00:00:00 UTC"))
788
- assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:00:00 -0000"));t.localtime
789
- assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 09:00:00 +0900"))
790
- assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 01:00:00 +0100"))
791
- assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:00:00 +0000"))
792
- assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:00:00 -0100"))
793
- end
794
-
795
- def test_xmlschema_leap_second
796
- t = Time.utc(1998,12,31,23,59,59)
797
- assert_equal(t, Time.xmlschema("1998-12-31T23:59:59Z"))
798
- assert_equal(t, Time.xmlschema("1998-12-31T23:59:59-00:00"));t.localtime
799
- assert_equal(t, Time.xmlschema("1999-01-01T08:59:59+09:00"))
800
- assert_equal(t, Time.xmlschema("1999-01-01T00:59:59+01:00"))
801
- assert_equal(t, Time.xmlschema("1998-12-31T23:59:59+00:00"))
802
- assert_equal(t, Time.xmlschema("1998-12-31T22:59:59-01:00"));t.utc
803
- t += 1
804
- assert_equal(t, Time.xmlschema("1998-12-31T23:59:60Z"))
805
- assert_equal(t, Time.xmlschema("1998-12-31T23:59:60-00:00"));t.localtime
806
- assert_equal(t, Time.xmlschema("1999-01-01T08:59:60+09:00"))
807
- assert_equal(t, Time.xmlschema("1999-01-01T00:59:60+01:00"))
808
- assert_equal(t, Time.xmlschema("1998-12-31T23:59:60+00:00"))
809
- assert_equal(t, Time.xmlschema("1998-12-31T22:59:60-01:00"));t.utc
810
- t += 1 if t.sec == 60
811
- assert_equal(t, Time.xmlschema("1999-01-01T00:00:00Z"))
812
- assert_equal(t, Time.xmlschema("1999-01-01T00:00:00-00:00"));t.localtime
813
- assert_equal(t, Time.xmlschema("1999-01-01T09:00:00+09:00"))
814
- assert_equal(t, Time.xmlschema("1999-01-01T01:00:00+01:00"))
815
- assert_equal(t, Time.xmlschema("1999-01-01T00:00:00+00:00"))
816
- assert_equal(t, Time.xmlschema("1998-12-31T23:00:00-01:00"))
817
- end
818
-
819
- def test_ruby_talk_152866
820
- t = Time::xmlschema('2005-08-30T22:48:00-07:00')
821
- assert_equal(31, t.day)
822
- assert_equal(8, t.mon)
823
- end
824
-
825
- def test_parse_fraction
826
- assert_equal(500000, Time.parse("2000-01-01T00:00:00.5+00:00").tv_usec)
827
- end
828
- end
829
- end
@@ -1,5 +1,5 @@
1
1
  module RubySL
2
2
  module Time
3
- VERSION = "1.0.2"
3
+ VERSION = "2.0.3"
4
4
  end
5
5
  end
@@ -16,10 +16,10 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ["lib"]
18
18
 
19
- spec.add_runtime_dependency "rubysl-parsedate", "~> 1.0"
20
- spec.add_runtime_dependency "rubysl-rational", "~> 1.0"
19
+ spec.required_ruby_version = "~> 2.0"
21
20
 
22
21
  spec.add_development_dependency "bundler", "~> 1.3"
23
22
  spec.add_development_dependency "rake", "~> 10.0"
24
23
  spec.add_development_dependency "mspec", "~> 1.5"
24
+ spec.add_development_dependency "rubysl-prettyprint", "~> 2.0"
25
25
  end
@@ -0,0 +1,18 @@
1
+ require 'time'
2
+
3
+ describe "Time#strptime" do
4
+
5
+ it "parses number of seconds since Unix Epoch" do
6
+ Time.strptime('0', '%s').should == Time.at(0)
7
+ end
8
+
9
+ it "parses number of seconds since Unix Epoch as UTC" do
10
+ Time.strptime('0', '%s').utc?.should == false
11
+ end
12
+
13
+ it "parses number of seconds since Unix Epoch with timezone" do
14
+ Time.strptime('0 +0100', '%s %z').to_s.should == Time.at(0).getlocal('+01:00').to_s
15
+ Time.strptime('0 +0100', '%s %z').strftime('%s %z').should == "0 +0100"
16
+ end
17
+
18
+ end
metadata CHANGED
@@ -1,85 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysl-time
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Shirai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-28 00:00:00.000000000 Z
11
+ date: 2013-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rubysl-parsedate
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '1.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- version: '1.0'
27
- - !ruby/object:Gem::Dependency
28
- name: rubysl-rational
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ~>
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ~>
39
- - !ruby/object:Gem::Version
40
- version: '1.0'
41
13
  - !ruby/object:Gem::Dependency
42
14
  name: bundler
43
15
  requirement: !ruby/object:Gem::Requirement
44
16
  requirements:
45
- - - ~>
17
+ - - "~>"
46
18
  - !ruby/object:Gem::Version
47
19
  version: '1.3'
48
20
  type: :development
49
21
  prerelease: false
50
22
  version_requirements: !ruby/object:Gem::Requirement
51
23
  requirements:
52
- - - ~>
24
+ - - "~>"
53
25
  - !ruby/object:Gem::Version
54
26
  version: '1.3'
55
27
  - !ruby/object:Gem::Dependency
56
28
  name: rake
57
29
  requirement: !ruby/object:Gem::Requirement
58
30
  requirements:
59
- - - ~>
31
+ - - "~>"
60
32
  - !ruby/object:Gem::Version
61
33
  version: '10.0'
62
34
  type: :development
63
35
  prerelease: false
64
36
  version_requirements: !ruby/object:Gem::Requirement
65
37
  requirements:
66
- - - ~>
38
+ - - "~>"
67
39
  - !ruby/object:Gem::Version
68
40
  version: '10.0'
69
41
  - !ruby/object:Gem::Dependency
70
42
  name: mspec
71
43
  requirement: !ruby/object:Gem::Requirement
72
44
  requirements:
73
- - - ~>
45
+ - - "~>"
74
46
  - !ruby/object:Gem::Version
75
47
  version: '1.5'
76
48
  type: :development
77
49
  prerelease: false
78
50
  version_requirements: !ruby/object:Gem::Requirement
79
51
  requirements:
80
- - - ~>
52
+ - - "~>"
81
53
  - !ruby/object:Gem::Version
82
54
  version: '1.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubysl-prettyprint
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
83
69
  description: Ruby standard library time.
84
70
  email:
85
71
  - brixen@gmail.com
@@ -87,8 +73,8 @@ executables: []
87
73
  extensions: []
88
74
  extra_rdoc_files: []
89
75
  files:
90
- - .gitignore
91
- - .travis.yml
76
+ - ".gitignore"
77
+ - ".travis.yml"
92
78
  - Gemfile
93
79
  - LICENSE
94
80
  - README.md
@@ -104,6 +90,7 @@ files:
104
90
  - spec/rfc822_spec.rb
105
91
  - spec/shared/rfc2822.rb
106
92
  - spec/shared/xmlschema.rb
93
+ - spec/strptime_spec.rb
107
94
  - spec/xmlschema_spec.rb
108
95
  homepage: https://github.com/rubysl/rubysl-time
109
96
  licenses:
@@ -115,12 +102,12 @@ require_paths:
115
102
  - lib
116
103
  required_ruby_version: !ruby/object:Gem::Requirement
117
104
  requirements:
118
- - - '>='
105
+ - - "~>"
119
106
  - !ruby/object:Gem::Version
120
- version: '0'
107
+ version: '2.0'
121
108
  required_rubygems_version: !ruby/object:Gem::Requirement
122
109
  requirements:
123
- - - '>='
110
+ - - ">="
124
111
  - !ruby/object:Gem::Version
125
112
  version: '0'
126
113
  requirements: []
@@ -136,4 +123,6 @@ test_files:
136
123
  - spec/rfc822_spec.rb
137
124
  - spec/shared/rfc2822.rb
138
125
  - spec/shared/xmlschema.rb
126
+ - spec/strptime_spec.rb
139
127
  - spec/xmlschema_spec.rb
128
+ has_rdoc: