我有两个约会,如下:
2019-01-06 00:02:10 | END
2019-01-05 23:52:00 | START
如何以秒为单位计算和打印开始日期和结束日期之间的时差?
对于上述情况,我想得到类似的东西:
610
答案 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