我正在Linux中编写一个bash shell脚本,该程序将接受一个日期(mm-dd-yyyy)作为参数.我想知道是否有一种简单的方法来检查日期是否有效?是否有操作员,我可以使用测试来检查?
joh*_*n64 15
你可以检查一下 date -d "datestring"
所以date -d "12/31/2012"
是有效的,但使用连字符对bash无效.
您也可以使用单词:date -d "12-31-2012"
或date
两者都有效.
Ste*_*ens 10
您可以从输入日期值MM-DD-YYYY中提取日,月和年值,并将其验证为明确的(ISO)格式YYYY-MM-DD(您可以将DD-MM-YYY格式的日期验证为"更正"使用日期,例如25-12-2010,但它不是有效的MM-DD-YYY日期,因此需要先更改日期格式)
2005年11月30日有效:
$ DATE=11-30-2005; d=${DATE:3:2}; m=${DATE:0:2}; Y=${DATE:6:4}; echo "year=$Y, month=$m, day=$d"; if date -d "$Y-$m-$d" &> /dev/null; then echo VALID; else echo INVALID; fi
year=2005, month=11, day=30
VALID
$ DATE=11-30-2005; if date -d "${DATE:6:4}-${DATE:0:2}-${DATE:3:2}" &> /dev/null; then echo VALID; else echo INVALID; fi
VALID
Run Code Online (Sandbox Code Playgroud)
2005年11月31日未确认:
$ DATE=11-31-2005; d=${DATE:3:2}; m=${DATE:0:2}; Y=${DATE:6:4}; echo "year=$Y, month=$m, day=$d"; if date -d "$Y-$m-$d" &> /dev/null; then echo VALID; else echo INVALID; fi
year=2005, month=11, day=31
INVALID
$ DATE=11-31-2005; if date -d "${DATE:6:4}-${DATE:0:2}-${DATE:3:2}" &> /dev/null; then echo VALID; else echo INVALID; fi
INVALID
Run Code Online (Sandbox Code Playgroud)
1979年4月20日DD-MM-YYYY格式未作为MM-DD-YYYY日期验证:
$ DATE=20-04-1979; d=${DATE:3:2}; m=${DATE:0:2}; Y=${DATE:6:4}; echo "year=$Y, month=$m, day=$d"; if date -d "$Y-$m-$d" &> /dev/null; then echo VALID; else echo INVALID; fi
year=1979, month=20, day=04
INVALID
$ DATE=20-04-1979; if date -d "${DATE:6:4}-${DATE:0:2}-${DATE:3:2}" &> /dev/null; then echo VALID; else echo INVALID; fi
INVALID
Run Code Online (Sandbox Code Playgroud)
$ DATE="04-30-2005"; [[ $(date -d "${DATE//-/\/}" 2> /dev/null) ]] && echo VALID || echo INVALID
VALID
$ DATE="04-31-2005"; [[ $(date -d "${DATE//-/\/}" 2> /dev/null) ]] && echo VALID || echo INVALID
INVALID
Run Code Online (Sandbox Code Playgroud)
小智 8
对于脚本使用,我保持尽可能简单.使用日期函数测试日期值,然后检查进程的退出代码.
date -d "02/01/2000" 2>: 1>:; echo $?
Run Code Online (Sandbox Code Playgroud)
这会将标准输入和标准错误重定向为空,:
并使用echo返回退出代码,$?
允许我检查0 =良好日期和1 =错误日期.
为了在 BASH shell 中验证 OSX 上的 YYYY-MM-DD (ISO 8601) 日期,以下方法会验证格式和日期。
isYYYYMMDDdate() {
[[ "$1" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && [[ "$1" == $(date -r $(date -j -f "%Y-%m-%d" "$1" "+%s") '+%Y-%m-%d') ]] &> /dev/null; echo "$?"
}
Run Code Online (Sandbox Code Playgroud)
测试有效日期:2005-11-30
$ isYYYYMMDDdate 2005-11-30
0
Run Code Online (Sandbox Code Playgroud)
测试无效日期:2005-11-31
$ isYYYYMMDDdate 2005-11-31
1
Run Code Online (Sandbox Code Playgroud)
测试格式不正确的有效日期:1979-20-04
$ isYYYYMMDDdate 1979-20-04
1
Run Code Online (Sandbox Code Playgroud)