免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: leo_pro
打印 上一主题 下一主题

如何判断输入格式是否正确? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-12-19 21:18 |只看该作者
原帖由 walkerxk 于 2008-12-19 18:38 发表

那个本来就是有问题的,date太聪明了,输入1都可以。

那是,哈哈

论坛徽章:
0
22 [报告]
发表于 2008-12-19 22:27 |只看该作者
菜鸟代码,请dx不惜大刀,赐教,谢谢!

  1. #!/bin/bash
  2. # Fri Dec 19 22:13:56  2008
  3. #利用加减一秒的办法来判断

  4. echo "input a date"
  5. read date1
  6.    yy=${date1%%-*}                 #没办法,date太聪明,两位的年份也认得
  7.    [ ${#yy} != 4 ] && exit 1        #+只能加句了

  8.    tmp=${date1##*:}   #取秒
  9.    echo $tmp
  10.    if [[ "$tmp" != "59" ]]   
  11.       then
  12.        ((tmp++))       #非进位时间 则加一
  13. #       echo $tmp
  14.        date2=${date1%:*}:$tmp   
  15.        t_time=$((`date -d "$date2" +%s`-`date -d"$date1" +%s`))
  16.    else
  17.        ((tmp--))      #否则减一
  18. #       echo $tmp
  19.        date2=${date1%:*}:$tmp
  20.        t_time=$((`date -d "$date1" +%s`-`date -d"$date2" +%s`))
  21.    fi
  22.    if [[ t_time -eq 1 ]]   #时间差是否为一秒
  23.       then
  24. #        echo $t_time ok
  25.         exit 0
  26.      else
  27. #     echo error
  28.       exit 1
  29. fi
复制代码

[ 本帖最后由 haimming 于 2008-12-20 00:58 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2008-12-19 23:45 |只看该作者
原帖由 haimming 于 2008-12-19 22:27 发表
菜鸟代码,请dx不惜大刀,赐教,谢谢!

#!/bin/bash
# Fri Dec 19 22:13:56  2008
#利用加减一秒的办法来判断

echo "input a date"
read date1
   tmp=${date1##*:}   #取秒
   echo $tmp
   if [[ ...



好像仍然没看到对闰月及大小月的处理

论坛徽章:
0
24 [报告]
发表于 2008-12-19 23:50 |只看该作者
我交给了date处理啊,date在处理string时,如果没有这个日期,错误的日期会返回1的

[ 本帖最后由 haimming 于 2008-12-19 23:51 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2008-12-20 00:31 |只看该作者
原帖由 haimming 于 2008-12-19 23:50 发表
我交给了date处理啊,date在处理string时,如果没有这个日期,错误的日期会返回1的



那如果没有相应的秒数或者分钟、小时数比如25:69:83,date是否会返回错误呢?

论坛徽章:
0
26 [报告]
发表于 2008-12-20 00:44 |只看该作者

回复 #25 welcome008 的帖子

会的,我测试过了,至少在我这里是这样 的

不过,还是有个问题,年份可以设置为两位数,我得加几句才行

论坛徽章:
0
27 [报告]
发表于 2008-12-20 10:09 |只看该作者
抄了walkerxk dx的一段,又是盗版,呵呵
好像可以更简单些,但和上面一样依然有问题,date只能测1901年以后的日期,如果输入超出了这个范围,就没辙了

  1. read a
  2. [[ "$a" != [0-9]{4}-[0-9]{1,2}-[0-9]{1,2}\ [0-9]{2}:[0-9]{2}:[0-9]{2} ]] ||| exit 1 #格式由这句判断
  3. date -d "$a" || exit 1  #日期由这句判断
  4. exit 0    #都符合,返回0
复制代码

[ 本帖最后由 haimming 于 2008-12-20 16:59 编辑 ]

论坛徽章:
0
28 [报告]
发表于 2008-12-20 19:40 |只看该作者
原帖由 haimming 于 2008-12-20 00:44 发表
会的,我测试过了,至少在我这里是这样 的

不过,还是有个问题,年份可以设置为两位数,我得加几句才行


既然对时分秒也会进行判断,你那加一秒的作用是啥呢?

直接通过date命令是否返回错误不就行了?

论坛徽章:
0
29 [报告]
发表于 2008-12-20 20:49 |只看该作者
谢谢welcome008的指导。
在第一种方法里,并没有去检查输入数据的格式(除了对年份的四位数外)。通过加减1秒,可以判断输入数据是否到了秒,因为像“2008-12-20 20:30”或“2008-12-20 20”,date也是认的,但在加减一秒中,这种输入的差值就不会为一秒了,就可以判断为不合格输入了。

不过,这样的作法烦了点,所以我觉得第二种作法简单些,先判断格式是否正确,再看日期是否存在。

不过,这两种方法都存在一个问题,就是只能判断1901-12-13到 2038-01-18.的范围,这是由date命令更准确的说是unix产生的

论坛徽章:
0
30 [报告]
发表于 2008-12-20 22:28 |只看该作者
原帖由 haimming 于 2008-12-20 20:49 发表
谢谢welcome008的指导。
在第一种方法里,并没有去检查输入数据的格式(除了对年份的四位数外)。通过加减1秒,可以判断输入数据是否到了秒,因为像“2008-12-20 20:30”或“2008-12-20 20”,date也是认的, ...



那要解决2038这个问题,恐怕你得自己写个日期函数了,无论使用c或者shell
不过比较新的版本的操作系统应该支持晚于2038年的问题了吧?

我这里没有比较新的linux系统,没法测试

[ 本帖最后由 welcome008 于 2008-12-20 22:29 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP