takot
 諸事情によりRuby                    1.8.[56] でやってます
                        /)
                     ///)
                  /,.=゙''"/
      /          i f ,.r='"-‐'つ____            Ruby1.9? こまけぇこたぁいいんだよ!!
    /          /        _,.-‐'~/⌒ ⌒\
        /     ,i       ,二ニ⊃( ●). (●)\
      /     ノ         il゙フ::::::⌒(__人__)⌒::::: \
          ,イ「ト、 ,!,!|             |r┬-|         |
         / iトヾヽ_/ィ"\                `ー'´      /
発端
   最初はスクレイピング
    して取ってくる「平成
    21年10月3日(土)」を
    parseしたかった
   URLに
    …/h211003.html みた
    いなのがあったので日
    和る
   これ(h211003)を取り
    出してDateオブジェク
    トに変換したい
   一般的にはDate.parse
    を使う
実際にやってみた
irb(main):002:0> d = Date.parse("h211003")
 #<Date: 3458007/2,0,2299161>
irb(main):004:0> p d.year
21
=> nil
irb(main):005:0> p d.day
3
 nil
 irb(main):007:0> p d.month
10
=> nil
   年のが失敗する……orz
   だが……
ただし
irb(main):008:0> d =
    Date.parse("H21.10.03")
=> #<Date:
    4910215/2,0,2299161>
irb(main):009:0> p d.year
2009
=>
nil
   “H21.10.03”なら行け
    る
これは勝つる!
どこで表記を調べてるか辿ってみた

            まずDate.rbを読んだ
            require „format‟ してる
            /lib/ruby/1.8/date/format.r
             bの中でいろんなパターン
             マッチングで涙ぐましい
             努力をしてる
            format.rb 読めばよくね?
format.rb
def self._parse_jis(str, e) # :nodoc:
 if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ')
   era = { 'm'=>1867,
        't'=>1911,
        's'=>1925,
        'h'=>1988
    }[$1.downcase]
   e.year = $2.to_i + era
   e.mon = $3.to_i
   e.mday = $4.to_i
   true
 end
end
   if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ')
if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in,
   ' ') ||
   str.sub!(/¥b([MTSH])(¥d{2})(¥d{2})(¥d{2})/in,
   ' ')
自作
   自分のスクリプト内でDate._parse_jis をoverride
   format.rb を直接書き換えても良いが,副作用を減らす
# to expand Japanese calendar parsing
def Date._parse_jis(str, e) # :nodoc:
 if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ') ||
     str.sub!(/¥b([MTSH])(¥d{2})(¥d{2})(¥d{2})/in, ' ')
   era = { 'm'=>1867,
          't'=>1911,
          's'=>1925,
          'h'=>1988
   }[$1.downcase]
   # p era # => 1988
   e.year = $2.to_i + era
   e.mon = $3.to_i
   e.mday = $4.to_i
   true
 end
end
できた!
d = Date.parse("h211003")
p d.year # => 2009
p d.month
p d.mday
% ./test.rb
2009
10
3
Future work
 当初の平成21年10月3日(土) とか 2009
  年10月3日 に対応したい
 Date.parse_jis のやり方が分かったので
  案外何とかなるかも
まとめ
 オレオレ日付のparseが
  したかったら,
  Date._parse_jis (など)
  をoverrideしよう!
 慶長9年 => K9. みたい
  のもいける!

Rubyで和暦をよみとる

  • 1.
  • 2.
     諸事情によりRuby 1.8.[56] でやってます  /) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ Ruby1.9? こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
  • 4.
    発端  最初はスクレイピング して取ってくる「平成 21年10月3日(土)」を parseしたかった  URLに …/h211003.html みた いなのがあったので日 和る  これ(h211003)を取り 出してDateオブジェク トに変換したい  一般的にはDate.parse を使う
  • 5.
    実際にやってみた irb(main):002:0> d =Date.parse("h211003")  #<Date: 3458007/2,0,2299161> irb(main):004:0> p d.year 21 => nil irb(main):005:0> p d.day 3  nil  irb(main):007:0> p d.month 10 => nil  年のが失敗する……orz  だが……
  • 6.
    ただし irb(main):008:0> d = Date.parse("H21.10.03") => #<Date: 4910215/2,0,2299161> irb(main):009:0> p d.year 2009 => nil  “H21.10.03”なら行け る
  • 7.
  • 8.
    どこで表記を調べてるか辿ってみた  まずDate.rbを読んだ  require „format‟ してる  /lib/ruby/1.8/date/format.r bの中でいろんなパターン マッチングで涙ぐましい 努力をしてる  format.rb 読めばよくね?
  • 9.
    format.rb def self._parse_jis(str, e)# :nodoc: if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ') era = { 'm'=>1867, 't'=>1911, 's'=>1925, 'h'=>1988 }[$1.downcase] e.year = $2.to_i + era e.mon = $3.to_i e.mday = $4.to_i true end end
  • 10.
    if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ')
  • 11.
    if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ') || str.sub!(/¥b([MTSH])(¥d{2})(¥d{2})(¥d{2})/in, ' ')
  • 12.
    自作  自分のスクリプト内でDate._parse_jis をoverride  format.rb を直接書き換えても良いが,副作用を減らす # to expand Japanese calendar parsing def Date._parse_jis(str, e) # :nodoc: if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ') || str.sub!(/¥b([MTSH])(¥d{2})(¥d{2})(¥d{2})/in, ' ') era = { 'm'=>1867, 't'=>1911, 's'=>1925, 'h'=>1988 }[$1.downcase] # p era # => 1988 e.year = $2.to_i + era e.mon = $3.to_i e.mday = $4.to_i true end end
  • 13.
    できた! d = Date.parse("h211003") pd.year # => 2009 p d.month p d.mday % ./test.rb 2009 10 3
  • 14.
    Future work  当初の平成21年10月3日(土)とか 2009 年10月3日 に対応したい  Date.parse_jis のやり方が分かったので 案外何とかなるかも
  • 15.
    まとめ  オレオレ日付のparseが したかったら, Date._parse_jis (など) をoverrideしよう!  慶長9年 => K9. みたい のもいける!