我正在Linux中编写一个bash shell脚本,这个程序将接受一个date(mm-dd-yyyy)作为参数。 我想知道是否有一个简单的方法来检查date是否有效? 有没有运营商,我可以用testing来检查?
按照相同的顺序洗脱多个文件
BASH:“出口k = 1”与“k = 1”之间的差异
当我使用'|'时究竟发生了什么 或'<',c ++
合并文件反向
你可以用date -d "datestring"
所以date -d "12/07/2012"是有效的,但使用连字符不适用于bash。
您也可以使用单词: date -d 'yesterday'或date -d '1 week ago'都是有效的。
您可以从输入日期值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
无效的日期格式不正确
2005年11月31日没有确认:
$ DATE=11-31-2005; d=${DATE:3:2}; m=${DATE:0:2}; Y=${DATE:6:4}; echo "year=$Y,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
不正确格式的有效日期不正确
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,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
另一种更简单的方法:使用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
以下工作对我很好。 非常感谢我的同事Tyler ChAmberlain为OSX解决方案。
# Validate a given date/time in Bash on either Linux or Mac (OSX). # Expected date/time format (in quotes from the command line): YYYY-MM-DD HH:MM:SS # Example(s): ./this_script "2012-02-29 13:00:00" # IS valid # ./this_script "2013-02-29 13:00:00" # Is NOT valid START_DATETIME=$1 function report_error_and_exit { local MSG=$1 echo "$MSG" >&2 exit 1 } # We can use OSTYPE to determine what OS we're running on. # From http://stackoverflow.com/questions/394230/detect-the-os-from-a-bash-script # Determine whether the given START_DATETIME is valid. if [[ "$OSTYPE" == "linux-gnu" ]] then # Validate the date on a Linux machine (Redhat or Debian). On Linux,this is # as easy as adding one minute and checking the return code. If one minute # cannot be added,then the starting value is not a valid date/time. date -d "$start_DATETIME UTC + 1 min" +"%F %T" &> /dev/null test $? -eq 0 || report_error_and_exit "'$start_DATETIME' is not a valid date/time value. $OSTYPE" elif [[ "$OSTYPE" == "darwin"* ]] then # Validate the date on a Mac (OSX). This is done by adding and subtracting # one minute from the given date/time. If the resulting date/time string is identical # to the given date/time string,then the given date/time is valid. If not,then the # given date/time is invalid. TEST_DATETIME=$(date -v+1M -v-1M -jf "%F %T" "$start_DATETIME" +"%F %T" 2> /dev/null) if [[ "$TEST_DATETIME" != "$start_DATETIME" ]] then report_error_and_exit "'$start_DATETIME' is not a valid date/time value. $OSTYPE" fi fi echo "The date/time is valid."
我在一个基于红帽的系统,一个基于Debian的系统和OSX上测试了这个脚本,并且在所有这三个平台上按预期工作。 我没有时间在Windows上测试(Cygwin)。
对于脚本的使用,我尽可能保持简单。 用日期函数测试日期值,然后检查进程的退出代码。
date -d "02/01/2000" 2>: 1>:; echo $?
这会将标准错误和标准错误重定向到null :并使用echo返回退出代码$? 允许我检查0 =好日期和1 =坏日期。
case语句可以很容易地支持多种格式和捕获日期部分,即
case ${date} in [0-3][0-9]-[0-1][0-9]-[0-9][0-9][0-9][0-9] ) yr=... mn=... dy=... ;; [0-1][0-9]-[0-3][0-9]-[0-9][0-9][0-9][0-9] ) yr=... dy=... mn=... ;; .... other formats ;; * ) echo "ERROR on date format,from value=$date,expected formats ..." return 1 ;; esac
我希望这有帮助。
您可以使用Python的时间或日期 时间模块中可用的strptime()函数或Perl的Time :: Piece模块。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。