日付を指定すると、その日付が存在する日付かをチェックします。メールフォームやアンケートなど日付を指定させる場合のチェックに使ってください。主に、月末日のチェックに使います。たとえば、2月なのに30日が指定されたり、6月なのに31日が指定された場合のチェックに役立ちます。
サブルーチン名
DateExists
引数
評価したい日付を西暦、月、日に分けて指定します。
- 西暦(1970 ~ 2023)
- 月(1 ~ 12)
- 日(1 ~ 31)
戻値
指定日が存在すれば「1」が、存在しなければ「0」が返ります。
使い方
まず、このサブルーチンを使うスクリプトのはじめのほうに、
use Time::Local;
を記述してください。お使いのサーバに、Perlモジュール Time::Local がインストールされていないと、このサブルーチンはご利用いただけませんので、ご注意さい。Perlモジュール Time::Local は、Perl5の標準モジュールですので、ほとんどのサーバでご利用いただけるはずです。
西暦2010年2月29日という日付を評価する場合には、
my $year = 2010;
my $month = 2;
my $day = 29;
my $exist = &DateExists($year, $month, $day);
my $month = 2;
my $day = 29;
my $exist = &DateExists($year, $month, $day);
とします。西暦2010年2月29日は存在しない日付ですので、$exist には 0 が与えられます。結果を $exist のようなスカラー変数に格納せずに、直接、以下のように if 文や unless 文の評価式で使うこともできます。
unless(&DateExists($year, $month, $day)) {
#エラー処理
}
#エラー処理
}
サブルーチン
sub DateExists {
my($year, $mon, $day) = @_;
eval {timelocal(0, 0, 0, $day, $mon-1, $year-1900);};
if($@) {return "0";}
if($mon == 12) {$mon = 0;}
my $time = timelocal(0, 0, 0, 1, $mon, $year-1900);
$time -= 60*60*24;
my @date = localtime($time);
if($day > $date[3]) {return 0;}
return 1;
}
my($year, $mon, $day) = @_;
eval {timelocal(0, 0, 0, $day, $mon-1, $year-1900);};
if($@) {return "0";}
if($mon == 12) {$mon = 0;}
my $time = timelocal(0, 0, 0, 1, $mon, $year-1900);
$time -= 60*60*24;
my @date = localtime($time);
if($day > $date[3]) {return 0;}
return 1;
}