使用bash在YYYYMMDDHHMMSS中增加日期/分钟/秒

时间:2016-07-20 22:35:13

标签: bash shell

假设今天的日期格式化为YYYYMMDDHHMMSS,例如20160720152654.我希望添加小时,分钟或秒数。

添加1小时应将日期更改为20160720162654 添加1分钟应将日期更改为20160720152754 添加1秒应将日期更改为20160720152655

这似乎给我的结果不正确

d = date +%Y%m%d%H%M%S pd = $(($ d +($ d%(15 * 60)))) echo $ d echo $ pd

输出 20160720155141 20160720155482

2 个答案:

答案 0 :(得分:5)

您可以操纵输入以将其传递给date -d

s='20160720162654'

# add 1 minute
date -d "${s:0:8} ${s:8:2}:${s:10:2}:${s:12:2} +1 min" '+%Y%m%d%H%M%S'    
20160720112754

# add 1 sec
date -d "${s:0:8} ${s:8:2}:${s:10:2}:${s:12:2} +1 sec" '+%Y%m%d%H%M%S'    
20160720112655

# add 1 hour
date -d "${s:0:8} ${s:8:2}:${s:10:2}:${s:12:2} +1 hour" '+%Y%m%d%H%M%S'    
20160720122654

答案 1 :(得分:0)

对anubhava答案的次要补充:

由于时区信息在YYYYMMDDHHMMSS中不可用,因此您可能会因实际时区而获得意外结果,例如:

s=20190201140000
date -d "${s:0:8} ${s:8:2}:${s:10:2}:${s:12:2} +1 minute" '+%Y%m%d%H%M%S'
20190201160100
# !? was expecting 20190201140100

据我了解,这是由于+1 minute表达式引起的,该表达式使date忽略了您当前的时区:

date
Thu Feb  7 17:07:28 +03 2019
date -d "20190207 17:07" "+%Y%m%d%H%M%S"
20190207170700
date -d "20190207 17:07 + 1 minute" "+%Y%m%d%H%M%S"
20190207190800

在我的情况下,时区偏移为+3,因此导致了问题:

date +%Z
+03

通过将当前时区添加到“ -d”参数中,您应该能够使其在所有时区上工作:

s=20190201140000
date -d "${s:0:8} ${s:8:2}:${s:10:2}:${s:12:2} $(date +%Z) +1 minute" '+%Y%m%d%H%M'
20190201140100

注1:以上所有命令均在RHEL 7.4和GNU bash 4.2.46(2)-发行版上运行

注2:我相信必须有一种更简单的方法:)