回答
只使用日期和外壳算术:
echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s")))/86400))
不需要使用'$(())'两次。只需使用一组分组圆括号:'echo $((($(date -d“2010-06-01”“+%s”) - $(date -d“2010-05-15”“+%s” ))/ 86400))'(为了强调和可读性而添加了可选空格) – 2010-08-02 11:05:43
请注意,'%s'特定于GNU日期,因此它可能不适用于非Linux系统。 [comp.unix.shell FAQ](http://cfajohnson.com/shell/cus-faq。html#6)对日期计算有很长的讨论(基本上,除非你有GNU日期,否则很难)。 – Gilles 2010-08-02 19:21:55
实际上有一个更大的问题:它有时会在春天失败...... [我的答案解释了为什么。](http://stackoverflow.com/questions/3385003/shell-script-to-get-difference-in-two-dates/3391111#3391111) – Gilles 2010-08-02 19:32:14
得到它
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)}'
感谢..
如果你打算使用'(())',你也可以使用'反引号。另外,不需要将某些东西放到'awk'中,只需使用'awk ...'BEGIN {printf ...}''。如果只是整数数学,你并不需要使用'awk':'echo“天数:$(((d2 - d1)/(60 * 60 * 24)))”' – 2010-08-02 11:16:16
谢谢... .............. – Hulk 2010-08-03 05:14:59
有一个解决方案,几乎作品:使用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。)
你的第三个例子实际上产生了'82800',因为你把表达误拼了,实际上由于'/'的更高优先级而加了'0',你能修复这个错字吗? – 2013-05-08 12:06:18
牛羚日期懂得%j来显示日年:
echo $(($(date -d 2010-06-01 +%j) - $(date -d 2010-05-15 +%j)))
交叉岁的边界将给出错误的结果,但自从你给固定日期...
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)))
想法仍然在其他答案相同。将日期转换为纪元时间,将结果减去并将结果转换为日期。
'python -c'from datetime import date; print(date(2010,6,1) - date(2010,5,15))。days'' – jfs 2010-08-02 04:53:31