存在する日付かどうかをチェックする

日付を指定すると、その日付が存在する日付かをチェックします。メールフォームやアンケートなど日付を指定させる場合のチェックに使ってください。主に、月末日のチェックに使います。たとえば、2月なのに30日が指定されたり、6月なのに31日が指定された場合のチェックに役立ちます。

サブルーチン名

DateExists()

引数

評価したい日付を西暦、月、日に分けて指定します。

  1. 西暦(1970 ~ 2023)
  2. 月(1 ~ 12)
  3. 日(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);

とします。西暦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;
 }