【问题标题】:Increment hours/minutes/seconds of date in YYYYMMDDHHMMSS using bash使用 bash 在 YYYYMMDDHHMMSS 中增加日期的小时/分钟/秒
【发布时间】:2016-07-20 22:35:12
【问题描述】:

假设今天的日期格式为 YYYYMMDDHHMMSS,例如 20160720152654。我想添加小时、分钟或秒。

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

这似乎给了我不正确的结果

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

输出 20160720155141 20160720155482

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    您可以操纵输入以将其传递给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
    

    【讨论】:

    • s=date +%Y%m%d%H%M%S echo "开始时间" $s e=date -d "${s:0:8} ${s:8:2}:${s:10:2}:${s:12:2} +1 min" +"%Y%m%d%H%M%S" echo "结束时间" $e 无法获得输出。我变得空白。 TIA
    • 这在 MAC 上不起作用。 #!/bin/bash e=$(date -d "${s:0:8} ${s:8:2}:${s:10:2}:${s:12:2} +1 min" +"%Y%m%d%H%M%S"); echo "$e" 我得到的错误是用法:date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [- fmt 日期 | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+格式]
    • 您将需要 gnu 日期。在我的 OSX 上,我使用 home brew 安装了它
    • 这可以解决问题。 e=date -v"+1M" "+%Y-%m-%dT%H:%M:%S"echo $e
    • 要解决时区问题,您可以添加-u 选项并将“UTC”添加到给定日期:date -u -d "${s:0:8} ${s:8:2}:${s:10:2}:${s:12:2} UTC +1 hour" '+%Y%m%d%H%M%S'
    【解决方案2】:

    对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)-release 上运行

    注2:我相信一定有更简单的方法:)

    【讨论】:

    • 关于时区问题的要点。 “我相信一定有更简单的方法”:是的,我认为使用date-u 选项来处理UTC 中的所有内容可以解决问题。
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2017-10-18
    • 2015-08-21
    • 2016-05-28
    • 2021-09-17
    相关资源
    最近更新 更多