linux+shell判断日期,关于linux:在bash shell中检查参数是否为有效日期

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

尝试使用date实用程序。

强制性:ISO 8601

您可以使用date -d"datestring"进行检查

因此date -d"12/31/2012"是有效的,但使用连字符,例如date -d"12-31-2012"对date无效。

您也可以使用以下单词:date -d 'yesterday'或date -d '1 week ago'都有效。

Bash不在乎,它的date抱怨连字符。

我只是尝试使用斜杠和反斜杠(bash .4.2.2,日期gnu coreutils 8,4),它很乐意接受两个字符,但不带连字符。

您可以从输入日期值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, 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

格式错误的有效日期不正确

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

另一种更简单的方法:使用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

我知道自您发布此答案以来已经有很长时间了,但是我如何修改您的条件,以便它检查"如果无效"而不是"如果有效"

与许多其他语言一样,您使用"!" 作为NOT运算符,然后更改您的then和else以适合,例如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" &> devnull; then echo INVALID; fi

对于脚本使用,我将其保持尽可能的简单。使用date函数测试日期值,然后检查流程的退出代码。

date -d"02/01/2000" 2>: 1>:; echo $?

这会将标准输入和标准错误重定向为null :,并使用echo使用$?返回退出代码,这使我可以检查0 =好日期和1 =坏日期。

我不会输出日期来创建一个名为":"的文件。 id清理位... date -d" 11/31/2018"> / dev / null 2>&1,将返回1(假)。 将31更改为30,则返回值为0(true)。

以下对我来说很好。非常感谢我的同事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."

我在基于Red Hat的系统,基于Debian的系统和OSX上测试了该脚本,并且该脚本在所有三个平台上均按预期工作。我没有时间在Windows(Cygwin)上进行测试。

使用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的时间或日期时间模块或Perl的Time :: Piece模块中可用的strptime()函数。

为了在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"$?"

}

它首先使用正则表达式匹配来检查格式。

然后,它将日期转换为纪元时间,然后再转换回日期。

如果原始日期和两次转换日期匹配,则它是有效的。

测试有效日期:2005-11-30

$ isYYYYMMDDdate 2005-11-30

0

测试无效的日期:2005-11-31

$ isYYYYMMDDdate 2005-11-31

1

测试格式错误的有效日期:1979-20-04

$ isYYYYMMDDdate 1979-20-04

1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值