0

数字のみで入力された日付の検証を行おうとしています(例:09042009、09 / 04/2009)。

コードは日付の長さをチェックするようになりました。

日付エントリの長さだけでなく、それが実際の日付であることをどのように検証しますか?テストと正規表現を組み合わせるための構文は何でしょうか?

現在存在するコード:

echo "Please enter the date you want (e.g. 07142009)"
level=1;
while [ $level -gt 0 ]; do
        read date;
        dateleng=`expr length $date`
        if [ dateleng -ne 8 ]; then
                echo "Bad date, please re-enter"; 
                else level=0;
        fi
done

これは、古いUnixシステムのKornShell(ksh)にあります。

4

4 に答える 4

1

このスクリプトは役に立ちますか?

于 2009-09-04T14:29:55.087 に答える
1

さて、あなたが本当に単一の正規表現としてそれをやりたいとあなたがうるう年を気にしないならば、これを試してください:

^(((0 [469])|(1 [1]))((0 [1-9])|([12] [0-9])|(30))|((0 [13578]) |(1 [02]))((0 [1-9])|([12] [0-9])|(3 [01]))|(02)((0 [1-9])| (1 [0-9])|(2 [0-8])))[0-9] {4} $
于 2009-09-04T20:12:40.903 に答える
1

引数として日付を受け入れ、structtm構造体に入力する小さなCプログラムを作成します。次に、標準Cライブラリルーチンを使用して日付をフォーマットし、入力された日付文字列と比較します。

#include <time.h>
main(int argc, char *argv[])
{
 struct tm tmx, *tm2;
    char tmbuf[9];
    time_t timet;
    if (argc < 1)
       exit(2);
    tmx.tm_sec = tmx.tm_min = tmx.tm_hour = tmx.tm_mday = tmx.tm_mon = 
    tmx.tm_year = tmx.tm_wday = tmx.tm_yday = tmx.tm_isdst = 0;
    tmx.tm_mon = (argv[1][0] - '0') * 10 + argv[1][1] - '0' - 1;
    tmx.tm_mday = (argv[1][2] - '0') * 10 + argv[1][3] - '0';
    tmx.tm_year = atoi(&argv[1][4]) - 1900;
    if ((timet = mktime(&tmx)) != (time_t)-1) {
        tm2 = localtime(&timet);
        strftime(tmbuf, sizeof(tmbuf), "%m%d%Y", tm2);
        if (strcmp(argv[1], tmbuf) == 0)
            exit(0);
    }
    exit(1);
}
/*
cc valdate.c -o valdate
*/

Cライブラリの日付形式の文字列が入力文字列と等しくない場合、日付は無効であり、Cプログラムはステータス1で終了します。それ以外の場合、日付は有効であり、終了ステータスは0です。シェルスクリプトは、日付を検証するCプログラム。

echo "Please enter the date you want (e.g. MMDDYYYY)"
read date
if valdate "$date"; then
    echo "Bad date ($date), please re-enter"
fi
于 2009-11-29T01:39:29.890 に答える
-1

電話date -d $date

エラーが返されるかどうかを確認します。

于 2009-09-04T14:35:32.737 に答える