以 yyyymmddhhmmss 格式减去日期和时间

以 yyyymmddhhmmss 格式减去日期和时间

我在yyyymmddhhmmssshell 变量中有两个格式的日期/时间值。
我想从另一个中减去一个并在几秒钟内得到结果,如下所示:

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

相关内容