如何从 %Y%m%d%H%M%S 格式的字符串添加时间

如何从 %Y%m%d%H%M%S 格式的字符串添加时间

看看我的 shell 脚本

#!/bin/sh
aaa=20200101101010
bbb=$(date -d "$aaa -5 minutes" +'%Y%m%d%H%M%S')

echo $bbb

我想得到:

20200101100510

但结果是:

20200101101009235500

发生了什么事?

我如何从 aaa 中减去 5 分钟?

我想看20200101100510

答案1

date您必须使用将其20200101101010解释为2020010110-10-10T00:00:00本地时间的 GNU 实现。

-d是 的非标准选项date,仅受少数实现支持,并且在支持它的实现中,如果要输入日期(例如在 GNU、busybox 或 ast-open 中date;BSDdate使用-rand-v代替),则完成在不同的实现中有所不同。

ast-open和 busyboxdate允许指定输入格式(busybox with -D,ast-open with -p),尽管不带偏移量 AFAIK。但是,您可以通过首先转换为纪元时间来删除 5 分钟,删除 300 秒并转换回您的格式。

2019 年 7 月有提案添加类似 GNU 的东西date但尚未发布(截至 2020-01-21)。

特别是对于 GNU date,您可以首先将输入 ( $aaa) 转换为它可以识别的格式,例如@RakeshShewale 的ksh93语法方法

另一种选择是使用zsh内置时间戳解析和格式化功能的 shell,避免依赖于不可移植的行为date

zmodload zsh/datetime || exit
format=%Y%m%d%H%M%S min=60

aaa=20200101101010

strftime -r -s bbb -- "$format" "$aaa" || exit
strftime    -s bbb -- "$format" "$((bbb - 5 * min))"
print -r -- "$bbb"

您可以$format根据其他格式的需要进行调整,但请注意,并非所有格式指令都支持strftime()(called by strftimewithout -rto格式时间戳)由strptime()(调用strftime -r解析时间戳)。检查您的man 3 strftime系统man 3 strptime

答案2

a=20200101101010
bbb=$(date --date "${a:0:4}-${a:4:2}-${a:6:2} ${a:8:2}:${a:10:2}:${a:12:2}")
ccc=$(date -d "$bbb -5 mins" +'%Y%m%d%H%M%S')
echo $ccc

输出:

20200101100510

相关内容