[前][次][番号順一覧][スレッド一覧]

ruby-changes:19294

From: tadf <ko1@a...>
Date: Mon, 25 Apr 2011 02:00:25 +0900 (JST)
Subject: [ruby-changes:19294] Ruby:r31333 (trunk): * ext/date/lib/date/format.rb: omitted to call _parse.

tadf	2011-04-25 02:00:18 +0900 (Mon, 25 Apr 2011)

  New Revision: 31333

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31333

  Log:
    * ext/date/lib/date/format.rb: omitted to call _parse.

  Modified files:
    trunk/ChangeLog
    trunk/ext/date/lib/date/format.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 31332)
+++ ChangeLog	(revision 31333)
@@ -1,3 +1,7 @@
+Mon Apr 25 01:58:50 2011  Tadayoshi Funaba  <tadf@d...>
+
+	* ext/date/lib/date/format.rb: omitted to call _parse.
+
 Mon Apr 25 01:03:03 2011  KOSAKI Motohiro  <kosaki.motohiro@g...>
 
 	* string.c (rb_to_id): remove unused variable.
Index: ext/date/lib/date/format.rb
===================================================================
--- ext/date/lib/date/format.rb	(revision 31332)
+++ ext/date/lib/date/format.rb	(revision 31333)
@@ -145,36 +145,173 @@
   end
 
   def self._iso8601(str) # :nodoc:
-    if /\A\s*(([-+]?\d{2,}|-)-\d{2}-\d{2}|
-	      ([-+]?\d{2,})?-\d{3}|
-	      (\d{2}|\d{4})?-w\d{2}-\d|
-	      -w-\d)
-	(t
-	\d{2}:\d{2}(:\d{2}([,.]\d+)?)?
+    if /\A\s*(?:([-+]?\d{2,}|-)-(\d{2})-(\d{2})|
+	        ([-+]?\d{2,})?-(\d{3})|
+	        (\d{2}|\d{4})?-w(\d{2})-(\d)|
+	        -w-(\d))
+	(?:t
+	(\d{2}):(\d{2})(?::(\d{2})(?:[,.](\d+))?)?
+	(z|[-+]\d{2}(?::?\d{2})?)?)?\s*\z/ix =~ str
+      if $3
+	e = {
+	  :mon => $2.to_i,
+	  :mday => $3.to_i
+	}
+	if $1 != '-'
+	  y = $1.to_i
+	  if $1.size < 4
+	    y += if y >= 69 then 1900 else 2000 end
+	  end
+	  e[:year] = y
+	end
+      elsif $5
+	e = {
+	  :yday => $5.to_i
+	}
+	if $4
+	  y = $4.to_i
+	  if $4.size < 4
+	    y += if y >= 69 then 1900 else 2000 end
+	  end
+	  e[:year] = y
+	end
+      elsif $8
+	e = {
+	  :cweek => $7.to_i,
+	  :cwday => $8.to_i
+	}
+	if $6
+	  y = $6.to_i
+	  if $6.size < 4
+	    y += if y >= 69 then 1900 else 2000 end
+	  end
+	  e[:cwyear] = y
+	end
+      elsif $9
+	e = {
+	  :cwday => $9.to_i
+	}
+      end
+      if $10
+	e[:hour] = $10.to_i
+	e[:min] = $11.to_i
+	e[:sec] = $12.to_i if $12
+      end
+      if $13
+	e[:sec_fraction] = Rational($13.to_i, 10**$13.size)
+      end
+      if $14
+	e[:zone] = $14
+	e[:offset] = zone_to_diff($14)
+      end
+      e
+    elsif /\A\s*(?:([-+]?(?:\d{4}|\d{2})|--)(\d{2})(\d{2})|
+		   ([-+]?(?:\d{4}|\d{2}))?(\d{3)}|-(\d{3})|
+		   (\d{4}|\d{2})?w(\d{2})(\d))
+	(?:t?
+	(\d{2})(\d{2})(?:(\d{2})(?:[,.](\d+))?)?
+	(z|[-+]\d{2}(?:\d{2})?)?)?\s*\z/ix =~ str
+      if $3
+	e = {
+	  :mon => $2.to_i,
+	  :mday => $3.to_i
+	}
+	if $1 != '--'
+	  y = $1.to_i
+	  if $1.size < 4
+	    y += if y >= 69 then 1900 else 2000 end
+	  end
+	  e[:year] = y
+	end
+      elsif $5
+	e = {
+	  :yday => $5.to_i
+	}
+	if $4
+	  y = $4.to_i
+	  if $4.size < 4
+	    y += if y >= 69 then 1900 else 2000 end
+	  end
+	  e[:year] = y
+	end
+      elsif $6
+	e = {
+	  :yday => $6.to_i
+	}
+      elsif $9
+	e = {
+	  :cweek => $8.to_i,
+	  :cwday => $9.to_i
+	}
+	if $7
+	  y = $7.to_i
+	  if $7.size < 4
+	    y += if y >= 69 then 1900 else 2000 end
+	  end
+	  e[:cwyear] = y
+	end
+      end
+      if $10
+	e[:hour] = $10.to_i
+	e[:min] = $11.to_i
+	e[:sec] = $12.to_i if $12
+      end
+      if $13
+	e[:sec_fraction] = Rational($13.to_i, 10**$13.size)
+      end
+      if $14
+	e[:zone] = $14
+	e[:offset] = zone_to_diff($14)
+      end
+      e
+    elsif /\A\s*(?:(\d{2}):(\d{2})(?::(\d{2})(?:[,.](\d+))?)?
 	(z|[-+]\d{2}(:?\d{2})?)?)?\s*\z/ix =~ str
-      _parse(str)
-    elsif /\A\s*(([-+]?(\d{2}|\d{4})|--)\d{2}\d{2}|
-	      ([-+]?(\d{2}|\d{4}))?\d{3}|-\d{3}|
-	      (\d{2}|\d{4})?w\d{2}\d)
-	(t?
-	\d{2}\d{2}(\d{2}([,.]\d+)?)?
+      e = {}
+      e[:hour] = $1.to_i if $1
+      e[:min] = $2.to_i if $2
+      e[:sec] = $3.to_i if $3
+      if $4
+	e[:sec_fraction] = Rational($4.to_i, 10**$4.size)
+      end
+      if $5
+	e[:zone] = $5
+	e[:offset] = zone_to_diff($5)
+      end
+      e
+    elsif /\A\s*(?:(\d{2})(\d{2})(?:(\d{2})(?:[,.](\d+))?)?
 	(z|[-+]\d{2}(\d{2})?)?)?\s*\z/ix =~ str
-      _parse(str)
-    elsif /\A\s*(\d{2}:\d{2}(:\d{2}([,.]\d+)?)?
-	(z|[-+]\d{2}(:?\d{2})?)?)?\s*\z/ix =~ str
-      _parse(str)
-    elsif /\A\s*(\d{2}\d{2}(\d{2}([,.]\d+)?)?
-	(z|[-+]\d{2}(\d{2})?)?)?\s*\z/ix =~ str
-      _parse(str)
+      e = {}
+      e[:hour] = $1.to_i if $1
+      e[:min] = $2.to_i if $2
+      e[:sec] = $3.to_i if $3
+      if $4
+	e[:sec_fraction] = Rational($4.to_i, 10**$4.size)
+      end
+      if $5
+	e[:zone] = $5
+	e[:offset] = zone_to_diff($5)
+      end
+      e
     end
   end
 
   def self._rfc3339(str) # :nodoc:
-    if /\A\s*-?\d{4}-\d{2}-\d{2} # allow minus, anyway
-	(t|\s)
-	\d{2}:\d{2}:\d{2}(\.\d+)?
+    if /\A\s*(-?\d{4})-(\d{2})-(\d{2}) # allow minus, anyway
+	(?:t|\s)
+	(\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?
 	(z|[-+]\d{2}:\d{2})\s*\z/ix =~ str
-      _parse(str)
+      e = {
+	:year => $1.to_i,
+	:mon => $2.to_i,
+	:mday => $3.to_i,
+	:hour => $4.to_i,
+	:min => $5.to_i,
+	:sec => $6.to_i,
+	:zone => $8,
+	:offset => zone_to_diff($8)
+      }
+      e[:sec_fraction] = Rational($7.to_i, 10**$7.size) if $7
+      e
     end
   end
 
@@ -223,20 +360,27 @@
   end
 
   def self._rfc2822(str) # :nodoc:
-    if /\A\s*(?:(?:#{Format::ABBR_DAYS.keys.join('|')})\s*,\s+)?
-	\d{1,2}\s+
-	(?:#{Format::ABBR_MONTHS.keys.join('|')})\s+
-	-?(\d{2,})\s+ # allow minus, anyway
-	\d{2}:\d{2}(?::\d{2})?\s*
-	(?:[-+]\d{4}|ut|gmt|e[sd]t|c[sd]t|m[sd]t|p[sd]t|[a-ik-z])\s*\z/iox =~ str
-      e = _parse(str, false)
-      if $1.size < 4
-	if e[:year] < 50
-	  e[:year] += 2000
-	elsif e[:year] < 1000
-	  e[:year] += 1900
-	end
+    if /\A\s*(?:(#{Format::ABBR_DAYS.keys.join('|')})\s*,\s+)?
+	(\d{1,2})\s+
+	(#{Format::ABBR_MONTHS.keys.join('|')})\s+
+	(-?\d{2,})\s+ # allow minus, anyway
+	(\d{2}):(\d{2})(?::(\d{2}))?\s*
+	([-+]\d{4}|ut|gmt|e[sd]t|c[sd]t|m[sd]t|p[sd]t|[a-ik-z])\s*\z/iox =~ str
+      y = $4.to_i
+      if $4.size < 4
+	y += if y >= 50 then 1900 else 2000 end
       end
+      e = {
+	:wday => Format::ABBR_DAYS[$1.downcase],
+	:mday => $2.to_i,
+	:mon =>  Format::ABBR_MONTHS[$3.downcase],
+	:year => y,
+	:hour => $5.to_i,
+	:min => $6.to_i,
+	:zone => $8,
+	:offset => zone_to_diff($8)
+      }
+      e[:sec] = $7.to_i if $7
       e
     end
   end
@@ -245,38 +389,89 @@
 
   def self._httpdate(str) # :nodoc:
     if /\A\s*(#{Format::ABBR_DAYS.keys.join('|')})\s*,\s+
-	\d{2}\s+
+	(\d{2})\s+
 	(#{Format::ABBR_MONTHS.keys.join('|')})\s+
-	-?\d{4}\s+ # allow minus, anyway
-	\d{2}:\d{2}:\d{2}\s+
-	gmt\s*\z/iox =~ str
-      _rfc2822(str)
+	(-?\d{4})\s+ # allow minus, anyway
+	(\d{2}):(\d{2}):(\d{2})\s+
+	(gmt)\s*\z/iox =~ str
+      {
+	:wday => Format::ABBR_DAYS[$1.downcase],
+	:mday => $2.to_i,
+	:mon =>  Format::ABBR_MONTHS[$3.downcase],
+	:year => $4.to_i,
+	:hour => $5.to_i,
+	:min => $6.to_i,
+	:sec => $7.to_i,
+	:zone => $8,
+	:offset => zone_to_diff($8)
+      }
     elsif /\A\s*(#{Format::DAYS.keys.join('|')})\s*,\s+
-	\d{2}\s*-\s*
+	(\d{2})\s*-\s*
 	(#{Format::ABBR_MONTHS.keys.join('|')})\s*-\s*
-	\d{2}\s+
-	\d{2}:\d{2}:\d{2}\s+
-	gmt\s*\z/iox =~ str
-      _parse(str)
+	(\d{2})\s+
+	(\d{2}):(\d{2}):(\d{2})\s+
+	(gmt)\s*\z/iox =~ str
+      y = $4.to_i
+      if y >= 0 && y <= 99
+	y += if y >= 69 then 1900 else 2000 end
+      end
+      {
+	:wday => Format::DAYS[$1.downcase],
+	:mday => $2.to_i,
+	:mon =>  Format::ABBR_MONTHS[$3.downcase],
+	:year => y,
+	:hour => $5.to_i,
+	:min => $6.to_i,
+	:sec => $7.to_i,
+	:zone => $8,
+	:offset => zone_to_diff($8)
+      }
     elsif /\A\s*(#{Format::ABBR_DAYS.keys.join('|')})\s+
 	(#{Format::ABBR_MONTHS.keys.join('|')})\s+
-	\d{1,2}\s+
-	\d{2}:\d{2}:\d{2}\s+
-	\d{4}\s*\z/iox =~ str
-      _parse(str)
+	(\d{1,2})\s+
+	(\d{2}):(\d{2}):(\d{2})\s+
+	(\d{4})\s*\z/iox =~ str
+      {
+	:wday => Format::ABBR_DAYS[$1.downcase],
+	:mon =>  Format::ABBR_MONTHS[$2.downcase],
+	:mday => $3.to_i,
+	:hour => $4.to_i,
+	:min => $5.to_i,
+	:sec => $6.to_i,
+	:year => $7.to_i
+      }
     end
   end
 
   def self._jisx0301(str) # :nodoc:
-    if /\A\s*[mtsh]?\d{2}\.\d{2}\.\d{2}
-	(t
-	(\d{2}:\d{2}(:\d{2}([,.]\d*)?)?
-	(z|[-+]\d{2}(:?\d{2})?)?)?)?\s*\z/ix =~ str
-      if /\A\s*\d/ =~ str
-	_parse(str.sub(/\A\s*(\d)/, 'h\1'))
-      else
-	_parse(str)
+    if /\A\s*([mtsh])?(\d{2})\.(\d{2})\.(\d{2})
+	(?:t
+	(?:(\d{2}):(\d{2})(?::(\d{2})(?:[,.](\d*))?)?
+	(z|[-+]\d{2}(?::?\d{2})?)?)?)?\s*\z/ix =~ str
+      era = {
+	'm'=>1867,
+	't'=>1911,
+	's'=>1925,
+	'h'=>1988
+      }[$1 ? $1.downcase : 'h']
+      e = {
+	:year => $2.to_i + era,
+	:mon =>  $3.to_i,
+	:mday => $4.to_i
+      }
+      if $5
+	e[:hour] = $5.to_i
+	e[:min] = $6.to_i if $6
+	e[:sec] = $7.to_i if $7
       end
+      if $8
+	e[:sec_fraction] = Rational($8.to_i, 10**$8.size)
+      end
+      if $9
+	e[:zone] = $9
+	e[:offset] = zone_to_diff($9)
+      end
+      e
     else
       _iso8601(str)
     end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]