2004年4月27日火曜日

Date::Simple 3.0のバグ?

Date-Simpleはperlで日付処理を簡単に行うことができるので、よく使うんですが、1900年2月28日以前の日付をコンストラクタに与えると、一日前のオブジェクトができてしまうことに気づきました。Redhat7.2, per5.6.1, Date::Simple3.0という環境で確認しました。モジュールのバグなのかOSの問題なのか、モジュールの中身を詳しく見ていないのでまだわかりませんが、Date::Simple3.xで1900年2月28日以前の日付を扱うときは注意が必要そうです。



ちなみにテストに用いたスクリプトはこんな感じです。

#!/usr/local/bin/perl

use strict;
use Date::Simple 3.0;

for( my $year = 1880; $year < 1920; $year++ ){
for( my $month = 1; $month < 13; $month++ ){
my $day_max = get_day_max($year,$month);
for( my $day = 1; $day <= $day_max; $day++ ){
my $date = Date::Simple->new($year,$month,$day);
print "Bad:",
sprintf('%d-%02d-%02d' , $year, $month, $day),
" ne $date\n"
unless $day == $date->day;
}
}
}

sub get_day_max{
my ($year,$month) = @_;
return $month == 2
? get_february_day_max($year)
}

sub get_february_day_max{
my $year = shift;
if ( $year % 4 == 0 ) {
if ( $year % 100 == 0 ) {
if( $year % 400 == 0 ) {
return 29
}else{
return 28
}
} else {
return 29
}
} else {
return 28
}
}

コンストラクタに渡した日にちとできたオブジェクトから取得した日にちが異なる場合以下のようにprintします。
Bad:1900-02-20 ne 1900-02-19
Bad:1900-02-21 ne 1900-02-20
Bad:1900-02-22 ne 1900-02-21
Bad:1900-02-23 ne 1900-02-22
Bad:1900-02-24 ne 1900-02-23
Bad:1900-02-25 ne 1900-02-24
Bad:1900-02-26 ne 1900-02-25
Bad:1900-02-27 ne 1900-02-26
Bad:1900-02-28 ne 1900-02-27


0 件のコメント:

コメントを投稿