看看我的 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
使用-r
and-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 strftime
without -r
to格式时间戳)由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