- 论坛徽章:
- 33
|
在shell中, 我们经常会使用时间. 比如 用做文件名, 或者标识.
很多同学都知道, DAY=`date +%F` 就能得到 当前的时间. 于是, 脚本中, 到处都是 `date +%F`. 在通常情况下, 这样不会有问题.
不过, 让我们换个位置. 比如, 下面的脚本是在 23:59:30 开始运行的. 相信多数人都会知道, DAY1 的值, 一定不会等于 DAY2. 但在实际中, 我却经常看到有人就是象下面这样用, 在白天或上午执行的脚本, 一般都不会出问题的, 只有在午夜运行才会有这个问题. 所以, 这其实是一个雷, 什么时候响, 没人知道 
- #!/bin/bash
- DAY1=`date +%F`
- sleep 60
- DAY2=`date +%F`
复制代码 很多时候, 我们需要计算时间差, 或者一天或几小时以前的时间值. 有些同学想得很简单, 用当前的值, 减掉1 就是昨天的值了.
- #!/bin/bash
- DAY1=`date +%Y%m%d`
- DAY2=$((DAY1-1))
复制代码 这看起来没啥问题. 但是, 如果今天(DAY1)是20140101, 你确定得到的是昨天的时间么?
DAY2的结果是20140100, 一个不存在的时间.
以上都不算是正确的做法, 正确的做法应该是在脚本一开始就取得当前的时间戳, 然后, 在整个脚本中, 始终使用这个时间戳来做为当前时间, 这才能保证, 在整个脚本的运行期间, 你得到的结果,都是你想要的, 而不管你是在午夜,还是大早上的运行你的脚本. 关于时间的计算, 最好是以"秒"为最小单位, 这样, 不仅可以保证你得到精确的时间, 还能保证你躲过什么1号, 或者年底, 或者闰年, 之类的麻烦.
以下例子仅供参考. 我在 Linux运行通过.- #!/bin/bash
- CUR_TIME=`date +%s`
- echo "Current timestamp is '$CUR_TIME'."
- CUR_DAY=`date +%F -d @$CUR_TIME`
- echo "Current date is '$CUR_DAY'."
- YES_DAY=`date +%F -d @$((CUR_TIME - 86400))`
- echo "Yesterday is '$YES_DAY'."
复制代码 |
|