给定两个日期之间以秒为单位的时差

时间:2019-01-09 04:38:41

标签: bash shell date

我有两个约会,如下:

2019-01-06 00:02:10 | END
2019-01-05 23:52:00 | START

如何以秒为单位计算和打印开始日期和结束日期之间的时差?

对于上述情况,我想得到类似的东西:

610

5 个答案:

答案 0 :(得分:2)

带有bash和GNU日期:

while read d t x x; do
  [[ $x == "END" ]] && end="$d $t" 
  [[ $x == "START" ]] && start="$d $t"
done < file

end=$(date -u -d "$end" '+%s')
start=$(date -u -d "$start" '+%s')

diff=$(($end-$start))
echo "$diff"

输出:

610

请参阅:man date

答案 1 :(得分:2)

假设基于 GNU 的操作系统,您可以使用date的选项%s-d来计算seconds中的时差命令替换和算术运算。

START="2019-01-05 23:52:00"
END="2019-01-06 00:02:10"

Time_diff_in_secs=$(($(date -d "$END" +%s) - $(date -d "$START" +%s)))
echo $Time_diff_in_secs

输出:

610

希望这会有所帮助!

答案 2 :(得分:1)

您要的是使用纯bash很难验证不可能。 Bash没有任何日期函数。对于日期处理,您将获得的大多数建议是使用操作系统的(use '[com.rpl.specter]) (let [input {:a "1" :b "2" :c [{:a "3" :b "4"} {:a "5" :b "6"}]} desired-output {:a :1 :b "2" :c [{:a :3 :b "4"} {:a :5 :b "6"}]} FIND-KEYS (recursive-path [] p (cond-path map? (continue-then-stay [MAP-VALS p]) vector? [ALL p] STAY))] (clojure.test/is (= (transform [FIND-KEYS (must :a)] keyword input) desired-output))) 命令,但是此命令的用法因操作系统而异。

在BSD(包括macOS)中:

date

在Linux或任何使用GNU日期的东西(可能还有Cygwin)中:

start="2019-01-05 23:52:00"; end="2019-01-06 00:02:10"
printf '%d\n' $(( $(date -j -f '%F %T' "$end" '+%s') - $(date -j -f '%F %T' "$start" '+%s') ))

只是为了好玩,如果由于某种原因您不能(或不想使用)printf '%d\n' $(( $(date -d "$end" '+%s') - $(date -d "$start" '+%s') )) ,您也许可以摆脱gawk的困扰:

date

gawk 'END{ print mktime(gensub(/[^0-9]/," ","g",end)) - mktime(gensub(/[^0-9]/," ","g",start)) }' start="$start" end="$end" /dev/null 选项以几乎与您提供的格式完全相同的格式解析日期字符串,从而简化了数学运算。

答案 3 :(得分:1)

START="2019-01-05 23:52:00"
END="2019-01-06 00:02:10"
parse () {
    local data=(`grep -oP '\d+' <<< "$1"`)
    local y=$((${data[0]}*12*30*24*60*60))
    local m=$((${data[1]}*30*24*60*60))
    local d=$((${data[2]}*24*60*60))
    local h=$((${data[3]}*60*60))
    local mm=$((${data[4]}*60))
    echo $((y+m+d+h+mm+${data[5]}))
}
START=$(parse "$START")
END=$(parse "$END")
echo $((END-START)) // OUTPUT: 610

答案 4 :(得分:1)

试图在非GNU操作系统(即macOS)上解决相同的问题。我无法应用上述任何解决方案,尽管它启发了我提出以下解决方案。我在我的Shell脚本中使用了一些嵌入式Ruby,应该可以在macOS上使用。

START="2019-01-05 23:52:00"
END="2019-01-06 00:02:10"

SECONDS=$(ruby << RUBY
require 'date'
puts ((DateTime.parse('${END}') - DateTime.parse('${START}')) * 60 * 60 * 24).to_i
RUBY)

echo ${SECONDS}
# 610