在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"
如果我们要检查的日期串和输出中串能匹配上,我们就认为时间是合法的,下面是我写的一个函数:
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,不过仍然只是格式检查,没有合法性检查。