如何在shell脚本中以格式%Y%m%d打印两个日期之间的日期?

时间:2016-05-13 23:12:34

标签: bash shell date

我有两个参数作为输入:startdate=20160512enddate=20160514

我希望能够在我的bash脚本中生成这两个日期之间的日期,不包括startdate,但包括enddate:

20160513 20160514 我正在使用linux机器。 我该如何做到这一点?谢谢。

3 个答案:

答案 0 :(得分:9)

使用GNU日期:

$ d=; n=0; until [ "$d" = "$enddate" ]; do ((n++)); d=$(date -d "$startdate + $n days" +%Y%m%d); echo $d; done
20160513
20160514

或者,分布在多行:

startdate=20160512
enddate=20160514
d=
n=0
until [ "$d" = "$enddate" ]
do  
    ((n++))
    d=$(date -d "$startdate + $n days" +%Y%m%d)
    echo $d
done

如何运作

  • d=; n=0

    初始化变量。

  • until [ "$d" = "$enddate" ]; do

    开始一个以enddate结尾的循环。

  • ((n++))

    增加日程表。

  • d=$(date -d "$startdate + $n days" +%Y%m%d)

    计算n之后startdate天的日期。

  • echo $d

    显示日期。

  • done

    表示循环结束。

答案 1 :(得分:1)

这应该适用于OSX,确保你的startdate小于enddate,其他明智的尝试使用epoch。

startdate=20160512
enddate=20160514

loop_date=$startdate

let j=0
while [ "$loop_date" -ne "$enddate" ]; do
        loop_date=`date   -j -v+${j}d  -f "%Y%m%d" "$startdate" +"%Y%m%d"`
        echo $loop_date
        let j=j+1
done

答案 2 :(得分:1)

另一种选择是使用dateseqhttp://www.fresse.org/dateutils/#dateseq)中的dateutils-i更改输入格式,-f更改输出格式。

$ dateseq -i%Y%m%d -f%Y%m%d 20160512 20160514
20160512
20160513
20160514
$ dateseq 2016-05-12 2016-05-14
2016-05-12
2016-05-13
2016-05-14