在Mac OS X shell脚本中从开始日期循环到结束日期

Hen*_*ötz 13 macos bash shell date

OS X(Snow Leopard)上的日期函数没有像GNU版本那样的--date选项,我无法弄清楚如何在OS X上获得以下内容:

startdate=2010-01-01
enddate=2010-01-31
foldate="$startdate"

until [ "$foldate" == "$enddate" ]
do
    # do something with the date here - like pass it as a parameter to a command
    foldate=`/bin/date --date "$foldate 1 day" +%Y-%m-%d`
done
Run Code Online (Sandbox Code Playgroud)

解决了SiegeX的答案:

startdate=2010-01-01
enddate=2010-01-31

sDateTs=`date -j -f "%Y-%m-%d" $startdate "+%s"`
eDateTs=`date -j -f "%Y-%m-%d" $enddate "+%s"`
dateTs=$sDateTs
offset=86400

while [ "$dateTs" -le "$eDateTs" ]
do
  date=`date -j -f "%s" $dateTs "+%Y-%m-%d"`
  printf '%s\n' $date
  dateTs=$(($dateTs+$offset))
done
Run Code Online (Sandbox Code Playgroud)

Sie*_*geX 1

man date通过运行并查看选项来阅读您的日期的联机帮助页-v。以下是摘录:

-v 根据 val 调整(即获取当前日期并显示调整结果;不实际设置日期)秒、分、小时、月日、星期几、月或年。如果 val 前面带有加号或减号,则根据剩余字符串向前或向后调整日期,否则设置日期的相关部分。使用这些标志可以根据需要多次调整日期。标志按照给定的顺序进行处理。

  • @hglattergotz 实际上,另一种选择是将偏移值转换为*秒*,然后通过 `-j -f "%Y-%m-%d" $foldate "+%s"` 将 $foldate 转换为纪元。将该纪元值添加到以秒为单位的偏移量中,然后通过 `-j -f "%s" $epoch_plus_seconds "+%Y-%m-%d"` 将其转换回日期 (2认同)