我在yyyymmddhhmmss
shell 变量中有两个格式的日期/时间值。
我想从另一个中减去一个并在几秒钟内得到结果,如下所示:
a=20170804020000
b=20170804015959
c=a-b
我想要的结果是c=1
(因为02:00:00
比 晚一秒01:59:59
),但我得到了c=4041
。
如何减去日期/时间值以获得以秒为单位的结果?
答案1
首先,您需要将日期转换为 unix time_t 格式(即自“纪元”1970-01-01 00:00:00 以来的秒数)。然后您可以通过简单的减法来计算差异。
程序无法理解date
当前格式的日期。它期望的内容看起来更像是用破折号和冒号分隔字段的日期,而不是数字。
sed
下面是一个在函数中使用“修复”日期的示例- 即,将它们转换为 可以理解的格式date
,然后使用date
转换为 time_t 秒,然后进行减法:
#!/bin/bash
a=20170804020000
b=20170804015959
function fixdate() {
printf "$1" | sed -E -e 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/'
}
a_seconds="$(date -d "$(fixdate "$a")" '+%s')"
b_seconds="$(date -d "$(fixdate "$b")" '+%s')"
seconds=$((a_seconds - b_seconds))
echo "$seconds"
答案2
它不漂亮,但这对我在 centos 有用:
a=20170804020000
b=20170804015959
ayear=${a:0:4}
amonth=${a:4:2}
aday=${a:6:2}
ahour=${a:8:2}
amin=${a:10:2}
asec=${a:12:2}
byear=${b:0:4}
bmonth=${b:4:2}
bday=${b:6:2}
bhour=${b:8:2}
bmin=${b:10:2}
bsec=${b:12:2}
adate=$(date -d "$amonth/$aday/$ayear $ahour:$amin:$asec" +"%s")
bdate=$(date -d "$bmonth/$bday/$byear $bhour:$bmin:$bsec" +"%s")
datediff=$((adate-bdate))
答案3
您可以通过将日期转换为 Unix 格式来对日期进行数学运算。但要做到这一点,首先您需要为这些值 (yyyymmddhhmmss) 赋予适当的格式 (yyyy-mm-dd hh:mm:ss)。
然后你可以做类似的事情:
$ a=$(date -d '2017-08-04 02:00:00' '+%s')
$ b=$(date -d '2017-08-04 01:59:59' '+%s')
$ c=$((a-b))
$ echo $a
1501830000
$ echo $b
1501829999
$ echo $c
1