如果日期为2010-06-01,另一个日期为2010-05-15
使用shell脚本或日期命令如何获取两个日期之间的天数
谢谢..
答案 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)))
跨越年份边界会产生错误的结果,但是因为你给了固定日期......