linux时间格式检验,linux的shell中,日期格式校验

在shell里对日期格式,有效性的检查,在网上搜了一下,对有效性检查,很多都是借助cal命令的输出,来检查日期是否有效,比如

这样: cal 2 2008|grep -q "/<29" && echo ok || echo error ,道理就是把年月日拆分开,在cal的某年某月的输出中去找日期,但仔细想一下,这种方法有问题,cal的输出一般是下面这样的,

2月 2008

日 月 火 水 木 金 土

1  2

3  4  5  6  7  8  9

10 11 12 13 14 15 16

17 18 19 20 21 22 23

24 25 26 27 28 29

如果校验2008年2月29号,我们在cal输出中可以找到29,则校验合法。看起来貌似没有问题,试想如果我要检查2029年2月29日的话,就会有问题了,cal 2 2902的输出如下:

2月 2902

日 月 火 水 木 金 土

1  2  3  4

5   6  7   8   9 10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28

此时29号是个无效的日期,而输出中的年2902中含有29这个字符串,所以会产生错误的检查。所以要使用cal来检查日期合法性,可能在grep使用上还需要改进,比如能否从文本的末尾开始搜索等等,或者找到两行以上匹配项等,这里本人grep也懂个皮毛,就不说了。

下面说说其他的方法来实现日期合法性检查,shell中有个date命令,我能可以使用date命令的输出来检查,试一下 date -d "2008-02-30" "+%F"有意思的是我们得到2008-03-01的输出,如果输入了合法的日期,输出将和我们给定的日期一致。虽然这样我们还是可以使用grep命令结合起来检查,

例如: date -d "2008-02-30" "+%F"|grep -q "2008-02-30"

如果我们要检查的日期串和输出中串能匹配上,我们就认为时间是合法的,下面是我写的一个函数:

function isValidDate(){

date -d "$1" "+%F"|grep -q "$1" 2>/dev/null

if [ $? = 0 ]; then

echo "ok"

else

echo "ng"

fi

}

http://blog.csdn.net/zmxj/archive/2009/03/02/3950303.aspx

不过好像date命令表示的时间范围是有限的,具体资料也没有查到,试了一下好像是1901年到2038年之间,之外会认为无效日期。

如果要对日期格式检查,注意,这里只是对日期显示格式进行检查。也可以使用grep命令,用正则表达式来匹配,这里也记录一下实验过的几种方法:

echo "2003-12-23" | grep '^[1-9][0-9]/{3/}-[0-1][0-9]-[0-9]/{2/}$'  匹配yyyy-mm-dd格式,注意这里的年是大于等于1000年的,如果不希望输出,可以给grep加-q参数。^和$匹配开始和结束,/{3/}匹配 连续3个数字。

echo "2888-12-31" | egrep "([0-9][0-9][0-9][0-9])-(0[1-9]|[1][0-2])-(0[1-9]|[1-2][0-9]|3[0-1])"

这种匹配可以检查到月必须是1到12,日必须是1到31,不过仍然只是格式检查,没有合法性检查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值