【Perl】DateTime::Calendar::Japanese::Era のバグ?


前回の記事の最後に書いたとおり、DateTime::Calendar::Japanese::Era の挙動がなんかおかしい。有り体に言って、明治より前の元号を指定すると正常に動かないのだ。例えば、こんなスクリプトを書くと……

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use DateTime::Format::Strptime;
use DateTime::Calendar::Japanese::Era;
binmode STDOUT => ":utf8";

my @ary = qw!
    1861/4/27
    1861/4/28
    1864/4/24
    1864/4/25
    1865/6/22
    1865/6/23
    1868/10/22
    1868/10/23
!;

my $fmt = new DateTime::Format::Strptime(
    pattern => "%Y/%m/%d",
);

for my $i ( @ary ) {
    my $d = $fmt->parse_datetime( $i );
    my $era = DateTime::Calendar::Japanese::Era
        ->lookup_by_date( datetime => $d );
    printf "%s => %s%d年\n", $i, $era->name, $d->year - $era->start->year + 1;
}

$ perl test.pl
1861/4/27 => 万延2年    # 万延から文久への改元は
1861/4/28 => 文久1年    # 1861年3月29日である
1864/4/24 => 文久4年    # 同様に、文久 => 元治は
1864/4/25 => 元治1年    # 1864年3月27日
1865/6/22 => 元治2年    # 元治 => 慶応は
1865/6/23 => 慶応1年    # 1865年5月1日
1868/10/22 => 慶応4年   # 慶応 => 明治は
1868/10/23 => 明治1年   # 1868年10月23日(これは正しい)

他にも試すとわかるが、“慶応から明治”への切り替わり以外は全て間違っている。モジュールのソースを読むと、各元号の始まりと終わりの月日は一つのファイルに纏めて書き込まれている。

$ cat /opt/local/lib/perl5/site_perl/5.12.0/auto/share/module/DateTime-Calendar-Japanese-Era/eras.yaml
---
- [ 'TAIKA',          '大化',     [ 645, 8, 18 ]]
- [ 'HAKUCHI',        '白雉',     [ 650, 4, 23 ], [ 654, 11, 26 ]]
- [ 'SHUCHOU',        '朱鳥',     [ 686, 9, 15 ]]
(以下略)
- [ 'MANNEI',         '万延',     [ 1860, 5, 8 ]]
- [ 'BUNKYU',         '文久',     [ 1861, 4, 28 ]]
- [ 'GENJI',          '元治',     [ 1864, 4, 25 ]]
- [ 'KEIOU',          '慶応',     [ 1865, 6, 23 ]]
- [ 'MEIJI',          '明治',     [ 1868, 10, 23 ] ]
- [ 'TAISHOU',        '大正',     [ 1912,  7, 30 ] ]
- [ 'SHOUWA2',        '昭和',     [ 1926, 12, 25 ] ]
- [ 'HEISEI',         '平成',     [ 1989,  1,  8 ] ]

う~む。明治より前は書いてある日付がむちゃくちゃである。どういうずれかたなのか法則性も分からない。正しく使うなら、このファイルを自力で直すしかないのだろうか。

コメントを残す