2010-08-02 69 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))) 

想法仍然在其他答案相同。将日期转换为纪元时间,将结果减去并将结果转换为日期。