检查参数是否是bash shell中的有效日期

Gar*_*ary 11 linux bash shell

我正在Linux中编写一个bash shell脚本,该程序将接受一个日期(mm-dd-yyyy)作为参数.我想知道是否有一种简单的方法来检查日期是否有效?是否有操作员,我可以使用测试来检查?

joh*_*n64 15

你可以检查一下 date -d "datestring"

所以date -d "12/31/2012"是有效的,但使用连字符对bash无效.

您也可以使用单词:date -d "12-31-2012"date两者都有效.

  • Bash不关心,抱怨连字符的是"约会". (9认同)

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)

替代更简单的方法:使用BASH变量字符串将连字符替换为斜杠

$ 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 =错误日期.


eea*_*rly 5

为了在 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)
  1. 它首先使用正则表达式匹配来检查格式。
  2. 然后,它将日期转换为纪元时间,然后再转换回日期。
  3. 如果原始日期和两次转换后的日期匹配,则该日期有效。

测试有效日期: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)