You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本验证用户输入的dd/mm/yyyy格式日期问题

验证DD/MM/YYYY格式有效日期的Bash脚本方案

问题背景

需要验证脚本传入的唯一参数是否为DD/MM/YYYY格式的有效日期(如13/01/2022):

  • 正则表达式仅能匹配格式,无法验证日期有效性(比如29/02/2023这类无效日期无法识别);
  • 直接使用date -d "$1" '+%d/%m/%Y'验证时,date命令默认解析逻辑不识别DD/MM/YYYY格式,会将其误判为MM/DD/YYYY,导致合法日期被判定无效(如13/01/2022会因13不是合法月份报错)。

解决方案

方案1:适配GNU Date(Linux系统)

GNU Date默认不直接支持DD/MM/YYYY解析,但可通过替换日期分隔符,转为date可识别的格式后再验证:

datestr="$1"
# 将斜杠替换为横杠,转为DD-MM-YYYY格式供date解析
if [[ "$datestr" == $(date -d "${datestr//\//-}" '+%d/%m/%Y' 2>/dev/null) ]]; then
    echo "Valid date"
else
    echo "Invalid date"
fi
  • 说明:${datestr//\//-}将所有/替换为-;2>/dev/null屏蔽解析无效日期时的错误输出;对比原字符串与date解析后回显的DD/MM/YYYY格式字符串,一致则为有效日期。

方案2:适配BSD Date(macOS等系统)

BSD Date支持通过-f参数直接指定输入日期格式,无需转换分隔符:

datestr="$1"
if [[ "$datestr" == $(date -j -f "%d/%m/%Y" "$datestr" "+%d/%m/%Y" 2>/dev/null) ]]; then
    echo "Valid date"
else
    echo "Invalid date"
fi
  • 说明:-j表示不修改系统时间;-f "%d/%m/%Y"指定输入日期格式为DD/MM/YYYY;通过原字符串与输出格式的一致性验证有效性。

补充:结合正则做前置格式校验

为减少无效格式的解析开销,可先通过正则初步过滤格式,再执行日期有效性验证(以GNU Date为例):

datestr="$1"
# 正则匹配DD/MM/YYYY格式(初步过滤)
if [[ "$datestr" =~ ^[0-3][0-9]/[0-1][0-9]/[0-9]{4}$ ]]; then
    # 执行日期有效性验证
    if [[ "$datestr" == $(date -d "${datestr//\//-}" '+%d/%m/%Y' 2>/dev/null) ]]; then
        echo "Valid date"
    else
        echo "Invalid date"
    fi
else
    echo "Invalid format (must be DD/MM/YYYY)"
fi

内容的提问来源于stack exchange,提问作者Sevs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:31:19