代码之家  ›  专栏  ›  技术社区  ›  jjclarkson Andy Rose

KornShell-脚本中的日期验证

  •  0
  • jjclarkson Andy Rose  · 技术社区  · 16 年前

    代码现在检查日期的长度。

    当前存在的代码:

    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 回复  |  直到 12 年前
        1
  •  1
  •   Jeremy Stein    16 年前
        2
  •  1
  •   Beta    16 年前

    ^(((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}$
    
        3
  •  1
  •   Howard Hong    16 年前

    编写一个小型C程序,接受日期作为参数并填充struct tm结构。然后使用标准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退出。否则该日期有效,

    echo "Please enter the date you want (e.g. MMDDYYYY)"
    read date
    if valdate "$date"; then
        echo "Bad date ($date), please re-enter"
    fi
    
        4
  •  -1
  •   Jeremy Stein    16 年前

    呼叫 date -d $date