当前位置: 首页 > news >正文

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,不过仍然只是格式检查,没有合法性检查。

相关文章:

  • ASP.NET MVC 中 Ajax.ActionLink 的使用
  • asp.net mvc2 数据验证方法
  • asp.net mvc 路由机制小记
  • mvc 中使用jquery ajax与action传值
  • asp.net MVC Controller 小记
  • access 如何让ID列重新开始
  • asp.net mvc view使用小结(TEXTBOX为例)
  • C#正则表达式整理备忘
  • asp.net mvc view 使用小结2
  • asp.net mvc2 ajax 基本调用
  • 秒大刀之旅----M2模型绘制
  • C# TASK 使用实例
  • 今天宝宝生日
  • Windows 7 的一些使用技巧
  • 无法自动调试WebService,未能远程调试过程,这通常说明未在服务器上启动调试
  • “大数据应用场景”之隔壁老王(连载四)
  • 【翻译】babel对TC39装饰器草案的实现
  • 2017 前端面试准备 - 收藏集 - 掘金
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Git 使用集
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • k个最大的数及变种小结
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • mysql中InnoDB引擎中页的概念
  • Redis在Web项目中的应用与实践
  • Shell编程
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue脚手架vue-cli
  • Wamp集成环境 添加PHP的新版本
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 免费小说阅读小程序
  • 排序算法学习笔记
  • 前端技术周刊 2019-01-14:客户端存储
  • 设计模式走一遍---观察者模式
  • 微信小程序实战练习(仿五洲到家微信版)
  • 延迟脚本的方式
  • 译米田引理
  • 用mpvue开发微信小程序
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 达梦数据库知识点
  • #数据结构 笔记一
  • #职场发展#其他
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (八)Flink Join 连接
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)【Hibernate总结系列】使用举例
  • (转)树状数组
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞