Shell脚本在两个日期中获得差异

时间:2010-08-02 04:31:26

标签: shell date

如果日期为2010-06-01,另一个日期为2010-05-15

使用shell脚本或日期命令如何获取两个日期之间的天数

谢谢..

5 个答案:

答案 0 :(得分:16)

仅使用日期和shell算法:

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

答案 1 :(得分:10)

有一个几乎的解决方案:使用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小时。您需要至少添加一小时(最多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。)

答案 2 :(得分: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 :(得分: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) ))

理念与其他答案一样。将日期转换为纪元时间,减去结果并将结果转换为天数。

答案 4 :(得分:0)

Gnu date知道%j显示一年中的某一天:

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

跨越年份边界会产生错误的结果,但是因为你给了固定日期......