免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8947 | 回复: 27
打印 上一主题 下一主题

[日期时间] 关于 shell 中 时间值的使用和计算. [复制链接]

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-20 10:41 |只看该作者 |倒序浏览
在shell中, 我们经常会使用时间. 比如 用做文件名, 或者标识.

很多同学都知道, DAY=`date +%F` 就能得到 当前的时间. 于是, 脚本中, 到处都是 `date +%F`. 在通常情况下, 这样不会有问题.

不过, 让我们换个位置. 比如, 下面的脚本是在 23:59:30 开始运行的. 相信多数人都会知道, DAY1 的值, 一定不会等于 DAY2. 但在实际中, 我却经常看到有人就是象下面这样用, 在白天或上午执行的脚本, 一般都不会出问题的, 只有在午夜运行才会有这个问题. 所以, 这其实是一个雷, 什么时候响, 没人知道

  1. #!/bin/bash
  2. DAY1=`date +%F`
  3. sleep 60
  4. DAY2=`date +%F`
复制代码
很多时候, 我们需要计算时间差, 或者一天或几小时以前的时间值.  有些同学想得很简单, 用当前的值, 减掉1 就是昨天的值了.

  1. #!/bin/bash
  2. DAY1=`date +%Y%m%d`
  3. DAY2=$((DAY1-1))
复制代码
这看起来没啥问题. 但是, 如果今天(DAY1)是20140101, 你确定得到的是昨天的时间么?
DAY2的结果是20140100, 一个不存在的时间.

以上都不算是正确的做法, 正确的做法应该是在脚本一开始就取得当前的时间戳, 然后, 在整个脚本中, 始终使用这个时间戳来做为当前时间, 这才能保证, 在整个脚本的运行期间, 你得到的结果,都是你想要的, 而不管你是在午夜,还是大早上的运行你的脚本.  关于时间的计算, 最好是以"秒"为最小单位, 这样, 不仅可以保证你得到精确的时间, 还能保证你躲过什么1号, 或者年底, 或者闰年, 之类的麻烦.
以下例子仅供参考. 我在 Linux运行通过.
  1. #!/bin/bash

  2. CUR_TIME=`date +%s`

  3. echo "Current timestamp is '$CUR_TIME'."

  4. CUR_DAY=`date +%F -d @$CUR_TIME`

  5. echo "Current date is '$CUR_DAY'."

  6. YES_DAY=`date +%F -d @$((CUR_TIME - 86400))`

  7. echo "Yesterday is '$YES_DAY'."
复制代码

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
2 [报告]
发表于 2014-02-20 10:46 |只看该作者
其实这个问题之前碰到过,就是在1月1号的时候发现程序出bug了。只不过之前回帖时候没有想起来。
楼主总结很到位~~感谢分享。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2014-02-20 10:50 |只看该作者
回复 2# nathanielwen

我以前是在小的时间(几分钟)的时候发现的bug.  
   

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
4 [报告]
发表于 2014-02-20 11:01 |只看该作者
因为程序是12月10多号写的,然后一直只需要取前一天的时间。所以跑了半个多月都没有问题。到1月1号时候发现-1导致时间计算出问题了。。。
话说当时,是在windows下用gawk写的。时间计算还是自己算的。。无限怀念linux的date。
回复 3# q1208c


   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
5 [报告]
发表于 2014-02-20 11:02 |只看该作者
多谢分享,很有用的一个小细节。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
6 [报告]
发表于 2014-02-20 11:11 |只看该作者
回复 4# nathanielwen

我在 windows 上 装了一个 perl 来处理东西. 跟Linux 也差不多了.
   

论坛徽章:
1
技术图书徽章
日期:2013-08-30 10:47:12
7 [报告]
发表于 2014-02-20 11:21 |只看该作者
date -d yesterday +%Y%m%d  这个可用不

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
8 [报告]
发表于 2014-02-20 11:23 |只看该作者
回复 7# 王晓兜

这个可以, 但要在 最后加  @$CUR_TIME 那个.

否则, 如果你在一个脚本中使用两次以上, 还可能出现这两次的结果不一致的情况.
   

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
9 [报告]
发表于 2014-02-20 11:24 |只看该作者
公司的电脑我没有权限装软件。。下的是gawk的绿色版。。
最近刚开始对perl有点研究,确实感觉到这门语言在某些方面,太强悍了。
回复 6# q1208c


   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
10 [报告]
发表于 2014-02-20 11:34 |只看该作者
回复 9# nathanielwen

perl 好象也算是绿色的. 不对系统做什么修改.
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP