From: Tadayoshi Funaba Date: 2002-05-21T20:36:13+09:00 Subject: [ruby-dev:17171] parsedate ふなばです。 1.6 の lib/parsedate.rb を date2 2.x の最新のものにしたいんですが、ど うでしょう。 一番重要な変更点は、'01:02:03 P.M. AMT' のようなパターンで、タイムゾー ンを拾いそこねるバグを潰したことです (P.M. でなく、PM などは大丈夫)。 その他、若干の改良 (?) を含みます。 --- parsedate3.rb 2001-01-18 12:09:47+09 1.3 +++ parsedate3.rb 2002-05-16 20:03:28+09 @@ -1,3 +1,3 @@ -# parsedate3.rb: Written by Tadayoshi Funaba 2000, 2001 -# $Id: parsedate3.rb,v 1.3 2001-01-18 12:09:47+09 tadf Exp $ +# parsedate3.rb: Written by Tadayoshi Funaba 2000-2002 +# $Id: parsedate3.rb,v 1.6 2002-05-16 20:03:28+09 tadf Exp $ @@ -21,2 +21,4 @@ + date.gsub!(/[^-+.\/:0-9a-z]+/ino, ' ') + # day @@ -31,4 +33,3 @@ \s* - ([ap])\.?m\.? - \b + ([ap])(?:m\b|\.m\.) )? @@ -37,3 +38,3 @@ ( - [a-z]+(?:\s+dst)? + [a-z]+(?:\s+dst)?\b | @@ -41,3 +42,2 @@ ) - \b )? @@ -64,3 +64,3 @@ \s+ - (\d+) + (-?\d+) )? @@ -79,3 +79,3 @@ \s+ - (\d+) + (-?\d+) )? @@ -88,3 +88,3 @@ # iso - elsif date.sub!(/(\d+)-(\d+)-(\d+)/no, ' ') + elsif date.sub!(/([-+]?\d+)-(\d+)-(-?\d+)/no, ' ') year = $1.to_i @@ -104,3 +104,3 @@ # vms - elsif date.sub!(/(\d+)-(#{MONTHPAT})\S*-(\d+)/ino, ' ') + elsif date.sub!(/(-?\d+)-(#{MONTHPAT})[^-]*-(-?\d+)/ino, ' ') mday = $1.to_i @@ -111,3 +111,3 @@ # sla - elsif date.sub!(%r|(\d+)/(\d+)(?:/(\d+))?|no, ' ') + elsif date.sub!(%r|(-?\d+)/(\d+)(?:/(-?\d+))?|no, ' ') mon = $1.to_i @@ -119,3 +119,3 @@ elsif date.sub!( - /(\d{4,14}) + /([-+]?)(\d{4,14}) (?: @@ -137,27 +137,27 @@ ' ') - case $1.size + case $2.size when 4 - mon = $1[ 0, 2].to_i - mday = $1[ 2, 2].to_i + mon = $2[ 0, 2].to_i + mday = $2[ 2, 2].to_i when 6 - year = $1[ 0, 2].to_i - mon = $1[ 2, 2].to_i - mday = $1[ 4, 2].to_i + year = ($1 + $2[ 0, 2]).to_i + mon = $2[ 2, 2].to_i + mday = $2[ 4, 2].to_i when 8, 10, 12, 14 - year = $1[ 0, 4].to_i - mon = $1[ 4, 2].to_i - mday = $1[ 6, 2].to_i - hour = $1[ 8, 2].to_i if $1.size >= 10 - min = $1[10, 2].to_i if $1.size >= 12 - sec = $1[12, 2].to_i if $1.size >= 14 + year = ($1 + $2[ 0, 4]).to_i + mon = $2[ 4, 2].to_i + mday = $2[ 6, 2].to_i + hour = $2[ 8, 2].to_i if $2.size >= 10 + min = $2[10, 2].to_i if $2.size >= 12 + sec = $2[12, 2].to_i if $2.size >= 14 end - if $2 - case $2.size + if $3 + case $3.size when 2, 4, 6 - hour = $2[ 0, 2].to_i - min = $2[ 2, 2].to_i if $2.size >= 4 - sec = $2[ 4, 2].to_i if $2.size >= 6 + hour = $3[ 0, 2].to_i + min = $3[ 2, 2].to_i if $3.size >= 4 + sec = $3[ 4, 2].to_i if $3.size >= 6 end end - zone = $3 + zone = $4 end @@ -165,3 +165,3 @@ if cyear and year - if year < 100 + if year >= 0 and year <= 99 if year >= 69