DateTime::TimeZone::Asia::Tokyo の 1888年問題?

たまには Perl の話題でも。

Perl の DateTime モジュールでの日時の取り扱いについて、とある件で色々と調べていたところ、どうやら1888年1月1日0時0分0秒を境におかしなことになっている。例えば、以下のようなコードを実行。

#!/usr/bin/perl

use strict;
use warnings;

use DateTime;
use DateTime::Format::W3CDTF;

my $dta = DateTime->new(
time_zone => 'Asia/Tokyo',
year => 1888,
month => 1,
day => 1,
hour => 0,
minute => 0,
second => 0,
);

my $dtb = DateTime->new(
time_zone => 'Asia/Tokyo',
year => 1887,
month => 12,
day => 31,
hour => 23,
minute => 59,
second => 59,
);

print DateTime::Format::W3CDTF->format_datetime($dta)."\n";
print DateTime::Format::W3CDTF->format_datetime($dtb)."\n";

すると、以下のような結果に。

$ perl datetimetest.pl
1888-01-01T00:00:00+09:00
1887-12-31T23:59:59+09:18:59

この 18:59 は一体何なんだとまた調べ進めると、どうやら1888年とは日本標準時が適用された年なのだということが分かります。

この日本の標準時に関する部分は1888年(明治21年)1月1日から適用された。

更に肝心の 18:59 はというと、どうやら、

斉藤国治「星の古記録」(岩波新書、1982)の 195 ページによれば、 現行の日本標準時が採用されたのは 1888 年 1 月 1 日だそうだ。 それまでは旧江戸城本丸跡中央気象台の地方平均太陽時を使っており、 両者の差は 19 分 1 秒、とのこと。

という事柄に関連している模様。ここでは19分1秒とされているので3秒の差がなんなのかは分からないけれど、どちらも約19分ということで起源はこれで間違いないかと。というわけで、1888年より前の日時を扱う可能性がある場合に、自前で W3CDTF 形式の日時を Parse しようとするには、注意が必要ですね、ということ。

それにしても、1888年より前の日時を扱うことなどほとんどないのでなかなか気付くことは無いのだろうけれど、当事者であるほとんどの日本人ですら知らないようなこと(え、常識?)が反映されている Perl モジュールってば、なんかすげぇなと思った次第です。

*何か僕の認識が間違ってたらどなたか突っ込んでください。優しい突っ込み大歓迎。