在Unix中用于计算两个时间戳差的命令

3
我可以帮您进行翻译。以下是涉及到IT技术的内容,需要您计算两个时间戳之间的差值,但是目前为止您还没有找到相关线索。举个例子:
time1 = 20160314 10:16:27
time2 = 20160313 15:17:28

从上面的内容中,我需要得到以下结果:差异为:“1天5小时1分钟1秒
请帮助我解决这个问题。

顺便提一下,time1 - time2 是 1 天减去 5 小时 1 分钟 1 秒。 - Déjà vu
Lol 这是一个命令吗?如果您能帮忙,我会非常感激。 - Bhargav Sutapalli
1
你需要使用date命令(提示,使用-d选项),以及shell算术(提示,使用/%运算符)来进行计算。 - glenn jackman
2
@BhargavSutapalli - 你是如何计算这两个日期和时间之间的差异的?在我看来,差异大约比一天短5个小时,而不是多5个小时。 - ghoti
2个回答

2
datediff() {
    t1=$(date -d "$1" +%s)
    t2=$(date -d "$2" +%s)
    diff=$(( $t1 - $t2 ))

    echo "Duration: $(( $diff / 86400 )) days $(($diff / 3600 )) hours $((( $diff % 3600) / 60)) minutes $(( $diff % 60 )) seconds"
}

date -d "$1" +%s 将给定的日期转换为时间戳(从1970年开始计算)。

有关日期转换的详细信息,请参见:

http://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html#Date-input-formats

示例:

$ date -d 2013-07-05 +%m/%d/%Y
07/05/2013
$ date -d 07/05/2013 +%F
2013-07-05

快速计算日期差异 - ghoti

2
您可能想使用的命令是“date”,但其使用取决于您的操作系统。您在问题标签中指定了,这并不足以得出单一答案。
总的来说,您将通过计算它们之间的秒数来计算日期之间的差异。因此,您的方法应该是找出每个日期的Unix纪元秒数,相减以找出差异,然后以适合您的任何格式打印结果。
在Linux中,“coreutils”中的GNU date有一个“-d”选项,可以理解许多日期引用。
$ time1="20160314 10:16:27"
$ date -d "$time1" '+%s'
1457964987

你可以用以下方式计算两个日期之间的秒数差:
echo "$(( $(date -d "$time1" '+%s') - $(date -d "$time2" '+%s') ))"

将其转换为您的输出格式只需要进行除法和余数运算:
s=$(( $(date -d "$time1" '+%s') - $(date -d "$time2" '+%s') ))

printf "%d day(s) %d hours %d minute %d second\n" \
   $(( s / 86400 )) \
   $(( s % 86400 / 3600 )) \
   $(( s % 3600 / 60 )) \
   $(( s % 60 ))

在FreeBSD中,另一方面,-d选项执行完全不同的操作,您需要使用-f-v来解析和调整日期。例如:
$ time1="20160314 10:16:27"
$ date -j -f '%Y%m%d %T' "$time1" '+%s'
1457964987

理解这个差异看起来很像 Linux 的方法:
s=$(( $(date -j -f '%Y%m%d %T' "$time1" '+%s') - $(date -j -f '%Y%m%d %T' "$time2" '+%s') ))

您可以使用我上面展示的相同printf命令来格式化输出。
我不知道Solaris或其他操作系统中date命令的工作细节,但您可以从shell中运行man date,看看这两种策略是否与您正在运行的任何操作系统兼容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接