From: Tadayoshi Funaba Date: 1998-02-02T00:33:05+09:00 Subject: [ruby-list:6162] Re: lib/parsedate.rb (Re: man/date/time) >それは、 基本的に "1st Sept 2001" のようなものか >(little endian)、"Sept 1st, 2001" のようなもので、年も含めて日付を考え >ても、そういう意味では大してバリエーションはないように思います。 >"Sat Jan 31 00:51:48 JST 1998" のようなものも、最初に時刻とタイムゾー >ンを除去できれば、そのように解釈することができます。そういう手直しはで >きるのではないかと思います。 即席なんですが、この考えに従って parsedate.rb の修正を試みてみました。 とりあえず、由緒正しい (?) date (1)、asctime(3)、RFC 822 スタイルなど には対応したつもりです。 #ANSI C の asctime() と、ruby の Time.asctime は書式が違うので、うっか #り間違えないようにしないといけませんね。 module ScanDate 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 scandate(date) if date.sub!(/(#{DAYPAT})[a-z]*,?/i, ' ') wday = DAYS[$1.downcase] end if date.sub!(/(\d+):(\d+)(?::(\d+))?(?:\s+([A-Z]{1,3}|[-+]\d{4}))?/, ' ') hour = $1.to_i min = $2.to_i if $3 sec = $3.to_i end if $4 zone = $4 end end if date.sub!(/(\d+)\S*\s+(#{MONTHPAT})\S*(?:\s+(\d+))?/i, ' ') mday = $1.to_i mon = MONTHS[$2.downcase] if $3 year = $3.to_i end elsif date.sub!(/(#{MONTHPAT})\S*\s+(\d+)\S*\s*,?(?:\s+(\d+))?/i, ' ') mon = MONTHS[$1.downcase] mday = $2.to_i if $3 year = $3.to_i end elsif date.sub!(/(\d\d?)\/(\d\d?)(?:\/(\d+))/, ' ') mon = $1.to_i mday = $2.to_i if $3 year = $3.to_i end end return year, mon, mday, wday, hour, min, sec, zone end module_function :scandate end --Tadayoshi Funaba