如何从两个“基于文本”的日期获取经过的时间

如何从两个“基于文本”的日期获取经过的时间

我想知道是否有一种方法可以计算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小时)的可能性,并相应调整格式。

相关内容