2016-03-14 11 views
1

我正在編寫一個腳本,它需要計算兩個時間戳之間的差異。我做了一些搜索,但到目前爲止還沒有得到任何線索。命令在UNIX中Substract兩個時間戳

比如講:

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

從上面我需要得到結果如下圖所示:不同的是:「1天5小時1分鐘1秒

請幫我解決這個。

+0

btw time1 - time2是1天減去5h 1m 1s –

+0

Lol 它是一個命令嗎?如果你能夠幫助,我會很感激 –

+1

你需要'date'命令(hint,'-d'選項)和shell算術(hint,'''''''運算符)來進行計算。 –

回答

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 
+0

http://unix.stackexchange.com/questions/24626/quickly-calculate-date-differences :-) – ghoti

1

你可能要使用的命令是date,但它的使用取決於您的操作系統。您在問題的標籤中指定了,這對於單個答案來說不夠具體。

一般來說,您可以通過計算它們之間的秒數來計算日期之間的差異。因此,您的方法應該是找出每個日期的第二個unix時期,然後減去以找出差異,然後以適合您的任何格式打印結果。

在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以查看這兩種策略中的任何一種是否與您運行的任何操作系統兼容。