From: Tadayoshi Funaba Date: 2004-03-16T21:47:46+09:00 Subject: [ruby-dev:23202] Re: [ruby-talk:93584] date/format.rb fix とくに意見がなければ、数日みて、このようにすると思います。 --- date.rb 2004-01-19 04:56:12+09 2.11 +++ date.rb 2004-03-15 19:27:14+09 @@ -469,16 +469,18 @@ def self.new_with_hash(elem, sg) elem ||= {} - y, m, d, h, min, s, of = - elem.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset) + y, m, d, h, min, s, fr, of = + elem.values_at(:year, :mon, :mday, + :hour, :min, :sec, :sec_fraction, :offset) h ||= 0 min ||= 0 s ||= 0 + fr ||= 0 of ||= 0 if [y, m, d].include? nil raise ArgumentError, 'invalid date' else - civil(y, m, d, h, min, s, of.to_r/86400, sg) + civil(y, m, d, h, min, s, of.to_r/86400, sg) + (fr/86400) end end --- date/format.rb 2004-01-19 05:43:28+09 2.12 +++ date/format.rb 2004-03-15 19:25:36+09 @@ -1,6 +1,8 @@ # format.rb: Written by Tadayoshi Funaba 1999-2004 # $Id: format.rb,v 2.12 2004-01-19 05:43:28+09 tadf Exp tadf $ +require 'rational' + class Date MONTHS = { @@ -182,6 +184,12 @@ return unless str.sub!(/\A%/o, '') when '%+' return unless __strptime(str, '%a %b %e %H:%M:%S %Z %Y', elem) +=begin + when '%.' + return unless str.sub!(/\A(\d+)/o, '') + val = $1.to_i.to_r / (10**$1.size) + elem[:sec_fraction] = val +=end when '%1' return unless str.sub!(/\A(\d+)/o, '') val = $1.to_i @@ -227,7 +235,7 @@ def self._parse(str, comp=false) str = str.dup - str.gsub!(/[^-+.\/:0-9a-z]+/ino, ' ') + str.gsub!(/[^-+,.\/:0-9a-z]+/ino, ' ') # day if str.sub!(/(#{PARSE_DAYPAT})\S*/ino, ' ') @@ -236,7 +244,10 @@ # time if str.sub!( - /(\d+):(\d+)(?::(\d+))? + /(\d+):(\d+) + (?: + :(\d+)(?:[,.](\d*))? + )? (?: \s* ([ap])(?:m\b|\.m\.) @@ -254,15 +265,18 @@ hour = $1.to_i min = $2.to_i sec = $3.to_i if $3 - if $4 + sec_fraction = $4.to_i.to_r / (10**$4.size) + end + + if $5 hour %= 12 - if $4.downcase == 'p' + if $5.downcase == 'p' hour += 12 end end - zone = $5 + zone = $6 end # eu @@ -368,7 +382,7 @@ \s* T? \s* - (\d{2,6}) + (\d{2,6})(?:[,.](\d*))? )? (?: \s* @@ -406,7 +420,10 @@ sec = $3[ 4, 2].to_i if $3.size >= 6 end end - zone = $4 + if $4 + sec_fraction = $4.to_i.to_r / (10**$4.size) + end + zone = $5 end if str.sub!(/\b(bc\b|bce\b|b\.c\.|b\.c\.e\.)/ino, ' ') @@ -432,6 +449,7 @@ elem[:hour] = hour if hour elem[:min] = min if min elem[:sec] = sec if sec + elem[:sec_fraction] = sec_fraction if sec_fraction elem[:zone] = zone if zone offset = zone_to_diff(zone) if zone elem[:offset] = offset if offset @@ -511,6 +529,10 @@ o << '%02d' % mm when '%%'; o << '%' when '%+'; o << strftime('%a %b %e %H:%M:%S %Z %Y') # TZ +=begin + when '%.' + o << '%06d' % (sec_fraction / (1.to_r/86400/(10**6))) +=end when '%1'; o << '%d' % jd when '%2'; o << strftime('%Y-%j') when '%3'; o << strftime('%Y-%m-%d')