Scrapdiary

DesigningとEngineeringの架け橋

日付を比較・評価する - Date::Simple

ある日付(指定日)から本日までが1週間が経過しているかどうかを確認したい。指定日で使用されるのは「月日(MMDD)」のみの値という条件。年をまたぐことを考慮して、どう比較・評価すればいいのかを考えてみた。

とりあえず比較してみる

日付データはCPANのModule、Date::Simpleを使って生成。

  1. 指定日オブジェクトに本日が属する年(YYYY)を付加する。(日付オブジェクトはYYYYを意識するので)
  2. 本日(YYYY-MM-DD)と指定日を比較し、指定日が大きければ未来としてNGとする。
  3. 本日と指定日の差が7日以内かどうかを評価する。

という感じでやってみる。


DateSimple.pl

#!/usr/bin/perl
use strict;
use warnings;
use Date::Simple qw(date today);

my $input_date  = $ARGV[0] || die("No parameter!\n"); #実行時に受け取る
my $today = today(); #今日の日付オブジェクトを生成
my $target_date = date($today->year . $input_date); #仮で指定日にYYYYを設定しオブジェクトを生成(1)
my $diff = $today - $target_date; #二つの日付の差分を取る
print "Today is $today, target date is $target_date and diff is $diff \n";
if($today < $target_date){ #(2)
        print "Target date is future!\n";
}else{
        if($diff <  7){ #(3)
                print "Compare is OK! (within 7 days)\n";
        }else{
                print "Compare is NG! (over 7 days)\n";
        }
}
exit;

実行時に引数で指定日を渡すようにする。今日が6月4日だと仮定。

「6月5日」を指定。

% perl DateSimple.pl 0605
Today is 2009-06-04, target date is 2009-06-06 and diff -1
Date that you setted is future!

「6月1日」を指定。

% perl DateSimple.pl 0601
Today is 2009-06-04, target date is 2009-06-01 and diff is 3  
Compare is OK!

「5月27日」を指定。

% perl DateSimple.pl 0528
Today is 2009-06-04, target date is 2009-05-27 and diff is 8 
Compare is NG! (over 7 days)

問題点

しかしながら上記だと年を越えての比較が出来ない。

my $today = date('2009-01-01'); #強制指定

この場合に引数で指定日を12月20日とした場合、ヘンテコな結果になってしまう。YYYYを意識しないで、単純にMM-DDの間隔を比較できればいいんだけれど・・・さてどうしたもんかな。(継続検討中)