需要验证输入日期的格式是否正确(mmddyyyy)

需要验证输入日期的格式是否正确(mmddyyyy)

我正在尝试验证用户输入的日期(mmddyyyy),使用了下面的内容,但它不起作用,请纠正我的错误。

 date  "+%m%d%Y" -d "02012019" > /dev/null  2>&1
        echo $?

答案1

zsh

#! /bin/zsh -
date=${1?No date specified}

zmodload zsh/datetime || exit
if
  strftime -rs t %m%d%Y "$date" 2> /dev/null &&
  strftime -s canonical_date_for_t %m%d%Y "$t" 2> /dev/null &&
  [[ $date = $canonical_date_for_t ]]
then
  print -r -- $date is valid
else
  print -ru2 -- ${(q+)date} is invalid
  exit 1
fi

strftime -r调用根据strptime()解析输入。而没有使用转换回格式化日期。$date%m%d%Ystrftime-r%m%d%Ystrftime()

strptime()会接受 a 02292019(并将其视为03012019),但一旦用 转换回来strftime(),就会03012019被拒绝。同样,12310001(0001-12-31) 将被拒绝,如12311预期的那样(%Y对于第 1 年 AC 是1,而不是0001;如果您愿意,在第二次调用中替换%Y%4Ystrftime0001预期的年份的表示1)。

答案2

如果我理解正确的话,这是一种可能的方法:

#!/bin/bash

d="$1"

[[ ! "$d" =~ ^[0-9]{8}$ ]] && \
  echo "Illegal number of characters, or not numbers." && \
  exit

d="${d:4}${d:2:2}${d:0:2}"

date  "+%m%d%Y" -d"$d" > /dev/null 2>&1

[ $? -ne 0 ] && echo "Invalid date." || echo "Valid date."

$ ./xx.sh 0201201x
Illegal number of characters, or not numbers.
$ ./xx.sh 0201201900000
Illegal number of characters, or not numbers.
$ ./xx.sh 32022019
Invalid date
$ ./xx.sh 02022019
Valid date.

现在01022019将是一个有效的日期,但如果用户先输入日期,然后输入月份,则您将需要另一组验证来满足您的特定需求。

相关内容