我想知道是否有一种方法可以计算bash中两个时间之间的差异。我有两个从日志文件中提取的字段:
开始时间:2月12日10:02:10结束时间:2月12日10:53:15
我需要的是一种手动方式来获取这两个日期之间经过的时间。由于时间值是“基于文本的”,而不是来自日期生成命令,所以我不知道是否有办法做到这一点。时间是 24 小时制的,因此希望这能让跨午夜的时间更容易处理。任何建议将不胜感激。彼得·V.
答案1
你可以使用一些邪恶的诡计:
date -d "Feb 12 10:02:10" +%s
将返回自该日期的纪元以来的秒数。将其与相同的命令(对于其他日期)结合起来并运行bc
:
echo "$(date -d 'Feb 12 10:53:15' +%s) - $(date -d 'Feb 12 10:02:10' +%s)" | bc
或 shell 的算术展开式:
echo "$(( $(date -d 'Feb 12 10:53:15' +%s) - $(date -d 'Feb 12 10:02:10' +%s) ))"
会给你
3065
两次之间的秒数。awk
如果您需要多次运行它,您可能可以用某种方式解析它。
答案2
如果您不介意外部辅助实用程序,请看看我的日期工具。上述任务翻译为:
ddiff -i '%b %d %H:%M:%S' 'Feb 12 10:02:10' 'Feb 12 10:53:15'
=>
3065s
其中-i
用于描述输入日期格式。
答案3
另一种解决方案没有bc
1. 将日期转换为 Unix 时间(也称为 POSIX 时间或 UNIX Epoch 时间)
$ date1=$(date -d "Feb 12 10:02:10" +%s)
$ date2=$(date -d "Feb 12 10:53:15" +%s)
$ printf '%s\n' "$date1" "$date2"
1518447730
1518450795
$
2.计算两个日期之间的差异
$ datediff="$((date2-date1))"
3. 您将在几秒钟内得到答案
$ echo "$datediff"
3065
$
4.转换为时、分、秒格式
$ printf '%02dh:%02dm:%02ds\n' $(($datediff/3600)) $(($datediff%3600/60)) $(($datediff%60))
00h:51m:05s
或者
$ TZ=UTC date '+%H:%M:%S' -d"@$datediff"
00:51:05
警惕结果≥86400(即24小时)的可能性,并相应调整格式。