如何使用shell命令获取两个日期之间的天数差异?

问题描述 投票:0回答:5

使用 shell 命令或

date
命令,如何获取两个日期之间的天数?
例如,
2010-06-01 - 2010-05-15

shell date
5个回答
23
投票

仅使用日期和 shell 算术:

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

14
投票

有一个 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。)


6
投票

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) ))

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


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)}'

谢谢..


0
投票

Gnu date 知道 %j 显示一年中的日期:

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

跨越年份界限会给出错误的结果,但既然你给出了固定的日期......

© www.soinside.com 2019 - 2024. All rights reserved.