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

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31333 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tadf 2011-04-24 17:00:18 +00:00
parent 0c1d2a0af4
commit 60c7967e12
2 changed files with 257 additions and 58 deletions

View File

@ -1,3 +1,7 @@
Mon Apr 25 01:58:50 2011 Tadayoshi Funaba <tadf@dotrb.org>
* ext/date/lib/date/format.rb: omitted to call _parse.
Mon Apr 25 01:03:03 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* string.c (rb_to_id): remove unused variable.

View File

@ -145,36 +145,173 @@ class Date
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 @@ class Date
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 @@ class Date
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