2010-08-02 23 views
14

如果有日期爲2010-06-01,另一個爲2010-05-15shell腳本來獲得差異兩個日期

使用shell腳本或date命令如何讓天的兩個日期之間的數

謝謝..

+1

'python -c'from datetime import date; print(date(2010,6,1) - date(2010,5,15))。days'' – jfs 2010-08-02 04:53:31

回答

14

只使用日期和外殼算術:

echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s")))/86400)) 
+1

不需要使用'$(())'兩次。只需使用一組分組圓括號:'echo $((($(date -d「2010-06-01」「+%s」) - $(date -d「2010-05-15」「+%s」 ))/ 86400))'(爲了強調和可讀性而添加了可選空格) – 2010-08-02 11:05:43

+0

請注意,'%s'特定於GNU日期,因此它可能不適用於非Linux系統。 [comp.unix.shell FAQ](http://cfajohnson.com/shell/cus-faq。html#6)對日期計算有很長的討論(基本上,除非你有GNU日期,否則很難)。 – Gilles 2010-08-02 19:21:55

+0

實際上有一個更大的問題:它有時會在春天失敗...... [我的答案解釋了爲什麼。](http://stackoverflow.com/questions/3385003/shell-script-to-get-difference-in-two-dates/3391111#3391111) – Gilles 2010-08-02 19:32:14

1

得到它

   d1=`date +%s -d $1` 
      d2=`date +%s -d $2` 
      ((diff_sec=d2-d1)) 
     echo - | awk -v SECS=$diff_sec '{printf "Number of days : %d",SECS/(60*60*24)}' 

感謝..

+3

如果你打算使用'(())',你也可以使用'反引號。另外,不需要將某些東西放到'awk'中,只需使用'awk ...'BEGIN {printf ...}''。如果只是整數數學,你並不需要使用'awk':'echo「天數:$(((d2 - d1)/(60 * 60 * 24)))」' – 2010-08-02 11:16:16

+0

謝謝... .............. – Hulk 2010-08-03 05:14:59

10

有一個解決方案,幾乎作品:使用GNU日期,打印自1970-01-01 00:00的秒數的%s日期格式。這些可以被減去找到兩個日期之間的時間差。

echo $((($(date -d 2010-06-01 +%s) - $(date -d 2010-05-15 +%s))/86400)) 

但下面顯示0在某些位置:

echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s))/86400)) 

由於日光節約時間,還有那些時間之間的僅23小時。您需要添加至少一個小時(最多23個)才能安全。

echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s) + 43200)/86400)) 

或者您可以告訴date在沒有DST的時區工作。

echo $((($(date -u -d 2010-03-29 +%s) - $(date -u -d 2010-03-28 +%s))/86400)) 

(POSIX說調用參考時區爲UTC,但同時也表示,不計閏秒,這樣的秒在一天的數量總是恰好在GMT + XX時區86400。)

+0

你的第三個例子實際上產生了'82800',因爲你把表達誤拼了,實際上由於'/'的更高優先級而加了'0',你能修復這個錯字嗎? – 2013-05-08 12:06:18

0

牛羚日期懂得%j來顯示日年:

echo $(($(date -d 2010-06-01 +%j) - $(date -d 2010-05-15 +%j))) 

交叉歲的邊界將給出錯誤的結果,但自從你給固定日期...

1

OSX date不同於GNU date。在OSX中這樣工作。這是非便攜式解決方案。

start_date=$(date -j -f "%Y-%m-%d" "2010-05-15" "+%s") 
end_date=$(date -j -f "%Y-%m-%d" "2010-06-01" "+%s") 

echo $((($end_date - $start_date)/(60 * 60 * 24))) 

想法仍然在其他答案相同。將日期轉換爲紀元時間,將結果減去並將結果轉換爲日期。