发现问题
在学习前辈们代码的适合,发现了一段奇怪的代码于是研究了一下。
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
思考验证
仔细思考了一下,才意识到这是一种时间的取整技巧,可以获得当前时间最近的一个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的倍数。
推广
回到之前那段奇怪的操作秒数 / 60 / 5 * 60 * 5, 其实秒数/60就化为分钟数了,再/ 5对应的当然就是按5min的倍数来取整。
那么15min就可以变为 秒数 / 60 / 15 \* 60 \* 15
如果是毫秒数的话再/1000和\* 1000就可以
再多一对/ 60和\* 60同样也可以推广到小时
总之,觉得比较有用就记录了一下。