命令在unix中Substract两个时间戳

时间:2016-03-14 15:34:06

标签: unix unix-timestamp

我正在编写一个脚本,需要计算两个时间戳之间的差异。我做了一些搜索但到目前为止还没有找到线索。

例如说:

time1 = 20160314 10:16:27
time2 = 20160313 15:17:28

从上面我需要得到如下结果:差异是:" 1天5小时1分1秒"

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

您可能想要使用的命令是date,但其用法取决于您的操作系统。您已在问题的代码中指定了,这对于单个答案来说并不是非常具体。

一般而言,您可以通过计算日期之间的秒数来计算日期之间的差异。因此,您的方法应该是为每个日期找出第二个时间段,减去找到差异,然后以适合您的任何格式打印结果。

在Linux中,GNU日期(来自" coreutils")有一个-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命令来格式化您的输出。

我没有详细介绍date命令在Solaris或其他操作系统中的工作方式,但是您可以从shell man date查看这些策略中的任何一个是否兼容使用您正在运行的任何操作系统。

答案 1 :(得分:0)

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