Linux时间取整技巧

  1. 发现问题

在学习前辈们代码的适合,发现了一段奇怪的代码于是研究了一下。

if [ "$VER" == "" ]; then
  # 获得一天前的时间精确到秒
  export ONE_DAY_AGO=$(date '+%Y-%m-%d %H:%M:%S' --date '1 days ago')
  # 获得秒数再取整,这里就很奇怪了
  export VER_UNIX_TS=$(expr `date -d "${ONE_DAY_AGO}"  +%s` / 60 / 5 \* 60 \* 5 ) 
  # 根据秒数计算一个新的时间
  export VER=$(date +%Y%m%d%H%M -d "1970-01-01 UTC-8 $VER_UNIX_TS sec"  -u)
fi
  1. 思考验证

仔细思考了一下,才意识到这是一种时间的取整技巧,可以获得当前时间最近的一个5min整数倍的时间节点。比如0:00、1:05、2:10、3:15这些时间点。

  • 我用docker创建了一个容器来做测试,有linux机器的可以忽略
    docker pull centos
    docker run -it centos /bin/bash
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime -R修改系统时区
  • 编写一个time_round.sh的shell脚本
#!/bin/bash
export VER_UNIX_TS=$(expr `date -d "${1}"  +%s` / 60 / 5 \* 60 \* 5 )
export VER=$(date '+%Y-%m-%d %H:%M' -d "1970-01-01 UTC-8 $VER_UNIX_TS sec"  -u)
echo $VER

随便测试了一些时间,结果跟预期的一样,得到的时间分钟都是5min的倍数。
在这里插入图片描述

  1. 推广

回到之前那段奇怪的操作秒数 / 60 / 5 \* 60 \* 5, 其实秒数/60就化为分钟数了,再/ 5对应的当然就是按5min的倍数来取整。

  • 那么15min就可以变为 秒数 / 60 / 15 \* 60 \* 15
  • 如果是毫秒数的话再/1000\* 1000就可以
  • 再多一对/ 60\* 60同样也可以推广到小时
    总之,觉得比较有用就记录了一下。

猜你喜欢

转载自blog.csdn.net/weixin_44112790/article/details/110083464