使用 shell 命令或
date
命令,如何获取两个日期之间的天数?2010-06-01 - 2010-05-15
仅使用日期和 shell 算术:
echo $((($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s")) / 86400))
有一个 almost 有效的解决方案:使用 GNU 日期的
%s
日期格式,它打印自 1970-01-01 00:00 以来的秒数。可以将它们相减来找到两个日期之间的时差。
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 小时。为了安全起见,您需要增加至少 1 小时(最多 23 小时)。
echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s) + 43200) / 86400))
或者您可以告诉
date
在没有夏令时的时区工作。
echo $((($(date -u -d 2010-03-29 +%s) - $(date -u -d 2010-03-28 +%s)) / 86400))
(POSIX 说参考时区是 UTC,但它也说不计算闰秒,因此在 GMT+xx 时区中一天的秒数始终恰好是 86400。)
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) ))
想法仍然与其他答案相同。将日期转换为纪元时间,减去并将结果转换为天数。
知道了
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)}'
谢谢..
Gnu date 知道 %j 显示一年中的日期:
echo $(($(date -d 2010-06-01 +%j) - $(date -d 2010-05-15 +%j)))
跨越年份界限会给出错误的结果,但既然你给出了固定的日期......