1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/parsedate.rb
matz 77b8745d4a * parse.y (yylex): fixed serious syntax misbehavior. do's
preceding was too high.  a block in `foo bar do .. end' should
  be passed to `foo', not `bar'.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1141 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2001-01-19 19:00:28 +00:00

181 lines
3.2 KiB
Ruby

# parsedate3.rb: Written by Tadayoshi Funaba 2000, 2001
# $Id: parsedate3.rb,v 1.3 2001-01-18 12:09:47+09 tadf Exp $
module ParseDate
MONTHS = {
'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4,
'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8,
'sep' => 9, 'oct' =>10, 'nov' =>11, 'dec' =>12
}
MONTHPAT = MONTHS.keys.join('|')
DAYS = {
'sun' => 0, 'mon' => 1, 'tue' => 2, 'wed' => 3,
'thu' => 4, 'fri' => 5, 'sat' => 6
}
DAYPAT = DAYS.keys.join('|')
def parsedate(date, cyear=false)
date = date.dup
# day
if date.sub!(/(#{DAYPAT})\S*/ino, ' ')
wday = DAYS[$1.downcase]
end
# time
if date.sub!(
/(\d+):(\d+)(?::(\d+))?
(?:
\s*
([ap])\.?m\.?
\b
)?
(?:
\s*
(
[a-z]+(?:\s+dst)?
|
[-+]\d+(?::?\d+)
)
\b
)?
/inox,
' ')
hour = $1.to_i
min = $2.to_i
sec = $3.to_i if $3
if $4
hour %= 12
if $4.downcase == 'p'
hour += 12
end
end
zone = $5
end
# eu
if date.sub!(
/(\d+)\S*
\s+
(#{MONTHPAT})\S*
(?:
\s+
(\d+)
)?
/inox,
' ')
mday = $1.to_i
mon = MONTHS[$2.downcase]
year = $3.to_i if $3
# us
elsif date.sub!(
/(#{MONTHPAT})\S*
\s+
(\d+)\S*
(?:
\s+
(\d+)
)?
/inox,
' ')
mon = MONTHS[$1.downcase]
mday = $2.to_i
year = $3.to_i if $3
# iso
elsif date.sub!(/(\d+)-(\d+)-(\d+)/no, ' ')
year = $1.to_i
mon = $2.to_i
mday = $3.to_i
mday, mon, year = year, mon, mday if $3.size >= 4
# jis
elsif date.sub!(/([MTSH])(\d+)\.(\d+)\.(\d+)/no, ' ')
e = { 'M'=>1867,
'T'=>1911,
'S'=>1925,
'H'=>1988
}[$1]
year, mon, mday = $2.to_i + e, $3.to_i, $4.to_i
# vms
elsif date.sub!(/(\d+)-(#{MONTHPAT})\S*-(\d+)/ino, ' ')
mday = $1.to_i
mon = MONTHS[$2.downcase]
year = $3.to_i
year, mon, mday = mday, mon, year if $1.size >= 4
# sla
elsif date.sub!(%r|(\d+)/(\d+)(?:/(\d+))?|no, ' ')
mon = $1.to_i
mday = $2.to_i
year = $3.to_i if $3
year, mon, mday = mon, mday, year if $1.size >= 4
# ddd
elsif date.sub!(
/(\d{4,14})
(?:
\s*
T?
\s*
(\d{2,6})
)?
(?:
\s*
(
Z
|
[-+]\d{2,4}
)
\b
)?
/nox,
' ')
case $1.size
when 4
mon = $1[ 0, 2].to_i
mday = $1[ 2, 2].to_i
when 6
year = $1[ 0, 2].to_i
mon = $1[ 2, 2].to_i
mday = $1[ 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
end
if $2
case $2.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
end
end
zone = $3
end
if cyear and year
if year < 100
if year >= 69
year += 1900
else
year += 2000
end
end
end
return year, mon, mday, hour, min, sec, zone, wday
end
module_function :parsedate
end