POSTされた予約日時データを判別して処理する

| コメント(0) | トラックバック(0)
メルマガ配信システムの予約配信機能などで役に立つperlスクリプト例。

フォームから年・月・日・時などを別々に受け取った場合、その日時が予約可能であるかなどを判別するのには、Time::Localモジュールを使うと便利。

※下の$FORMハッシュ名部分はご自分のリードパース環境に合わせて読み替えてください。
($inとか・・・)



sub check_reserve_day{    #配信日チェック

    if($FORM{'res_year'} eq "" || $FORM{'res_mon'} eq "" || $FORM{'res_day'} eq "" || $FORM{'res_time'} eq ""){
        &error("予約する日時を指定してください。");
    }

    my $leap = &leapyear($FORM{'res_year'});     #うるう年なら1
    if ($FORM{'res_day'} > $mdays[$FORM{'res_mon'}-1] ){
        if ($FORM{'res_mon'} == 2){
            if ($leap == 1){
                if ($FORM{'res_day'} > 29){
                    &error("存在しない日時です");
                }
            }
            else{
                if ($FORM{'res_day'} > 28){
                    &error("存在しない日時です");
                }
            }
        }
        else{
            &error("存在しない日時です");
        }
    }
    #モジュール読み込み
    use Time::Local qw( timelocal );
    #yyyy-mm-dd-tt形式をエポック秒に戻す
    my $res_epoch = &timelocal( 0, 0, $FORM{'reserve_time'}, $FORM{'res_day'}, $FORM{'res_mon'}-1, $FORM{'res_year'}-1900 );
    if (($res_epoch - time)/60 >= 60){
        if (($res_epoch - time)/60/60/24 > 30){
            &error("予約できるのは30日先までです");
        }
    }
    else{
        &error("予約可能日時は1時間後からです");
    }
}

sub leapyear{        #閏年
    my($year)=@_;
    if ($year % 4 == 0){
        if ($year % 100 == 0){
            if ($year % 400 == 0){
                return 1
            }
            else{
                return 0;
            }
        }
        else{
            return 1;
        }
    }
    else{
        return 0;
    }
}


※ちなみにエポック秒(1900年1月1日0:00からの経過秒)には、うるう秒は含まれません。

トラックバック(0)

トラックバックURL: http://www.igreks.jp/blog/mt-tb.cgi/6

コメントする