« ついにYahoo!もブログサービス開始。中身はNAVERか? | メイン | 雪になってます。 »

Date::Parseで1955年以下がうまく処理できない

日付の文字列をつかって年齢を求めるのに、まず、Date::Parse::str2timeを使っていたのだが、
1955年以下がうまく処理できないことに気づいた。

perl -MDate::Parse -e 'print Date::Parse::str2time($ARGV[0]),"?n"' 1955/04/16

はだめだが、

perl -MDate::Parse -e 'print Date::Parse::str2time($ARGV[0]),"?n"' 1956/04/16

こっちはOK。

原因はこれだな。Data::Parseの197行目

$year -= 1900 if defined $year && $year > 1900;


Date::Parseはunix timeに最終的に変換するときに、Time::Localのtimelocalを使うのだが、その年の判定方法が、

Years in the range 0..99 are interpreted as shorthand for years in the rolling "current century," defined as 50 years on either side of the current year. Thus, today, in 1999, 0 would refer to 2000, and 45 to 2045, but 55 would refer to 1955. Twenty years from now, 55 would instead refer to 2055. This is messy, but matches the way people currently think about two digit dates. Whenever possible, use an absolute four digit year instead.


となっているわけで、1955年を境に処理がおかしくなると言うということでいいのかしら。。

とりえあず、Date::Parseを丸ごとコピーして、
package宣言を変えて、197行目をコメントアウトして使わせてもらうことにしました。