【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;
}

Continue reading

【Perl】Excel 形式の和暦日付に変換する

Excel で和暦の日付は次のように表される。

書式: [年号][年].[月].[日]
例  : H22.10.26
      S64.1.7

これを Perl で扱おうと思って DateTime オブジェクトを扱うスクリプト書いた。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use DateTime::Format::Strptime;

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

my $平成 = $fmt->parse_datetime( "1989/1/8" );
my $昭和 = $fmt->parse_datetime( "1926/12/25" );
my $大正 = $fmt->parse_datetime( "1912/7/30" );
my $明治 = $fmt->parse_datetime( "1868/10/23" );

sub to_jp {
    my $d = shift;
    $d or return "";
    my $y = $d >= $平成 ? "H" . ( $d->year - $平成->year + 1 ) :
        $d >= $昭和 ? "S" . ( $d->year - $昭和->year + 1 ) :
        $d >= $大正 ? "T" . ( $d->year - $大正->year + 1 ) :
        $d >= $明治 ? "M" . ( $d->year - $明治->year + 1 ) :
        $d->year;
    sprintf "%s.%d.%d", $y, $d->month, $d->day;
}

for my $i (qw! 2010/10/26 1989/1/7 !) {
    my $dt = $fmt->parse_datetime( $i );
    print to_jp( $dt ) . "\n";
}
$ perl test.pl
H22.10.26
S64.1.7

Continue reading