【问题标题】:Bash loop between 2 date doesn't stop at the end of a month2 个日期之间的 Bash 循环不会在月底停止
【发布时间】:2015-02-26 14:52:02
【问题描述】:

我有一个 bash 脚本,参数中有 2 个日期。我想通过使用日期在这两个日期之间循环。所以我写了这段代码:

START_DATE=$1
END_DATE=$2

for ((date=$START_DATE; date != "$END_DATE + 1"; ));do
           echo $END_DATE
           date="$(date --date="$date + 1 days" +'%Y%m%d')"
done

我的日期是这样的格式:例如 20150226

所以我的脚本运行良好,直到 END_DATE 是这个月底(例如 20150228、20141231 20150131 ...)

对于这个错误你有什么建议吗?

谢谢

【问题讨论】:

  • 不要对非数字(日期戳)值使用数字数学。或者,如果您想在几秒钟内使用值。
  • 那我应该用什么?
  • 将时间戳转换为从纪元开始的秒数(在数字上可用)或找到其他方法来检测范围循环的结束。
  • 请注意:如果END_DATE20150228,那么ENDDATE+120150229。因为它不是闰年,date 永远不会等于那个,你会得到一个无限循环。您可以执行 'ENDDATE_PLUS_ONE=$(date --date="$END_DATE + 1 days" +'%Y%m%d')',然后进行比较。
  • Etan -- 有几根尖锐的秒针 -- 即由于夏令时。如果您在春季增加 24 小时,您可能会缺少 $END_DATE。您可以通过比较(使用小于)与 END_DATE 加上十二小时来解决这个问题,但这似乎不直观。

标签: bash shell date unix unix-timestamp


【解决方案1】:

这里有两个问题:

"$END_DATE + 1" 被评估为字符串 "20150228 + 1"

还有20150228 + 1 != 20150301

START_DATE=$1
END_DATE=$2
previous=$(( $1 - 1 ))

for (( date=$START_DATE; previous == date - 1; ));do
    echo $date
    previous=$date
    date="$(date --date="$date + 1 days" +'%Y%m%d')"
done

【讨论】:

  • 它没有运行,我仍然有同样的问题
【解决方案2】:
date=${1:-20150226}
end_date=${2:-20150310}

while [[ $date < $end_date ]]
do
    echo $date not reached $end_date
    date=$(gdate --date="$date + 1 days" +'%Y%m%d')
done

打印

20150226 not reached 20150310
20150227 not reached 20150310
20150228 not reached 20150310
20150301 not reached 20150310
20150302 not reached 20150310
20150303 not reached 20150310
20150304 not reached 20150310
20150305 not reached 20150310
20150306 not reached 20150310
20150307 not reached 20150310
20150308 not reached 20150310
20150309 not reached 20150310

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 2021-08-18
    • 2016-06-21
    • 2010-12-10
    • 1970-01-01
    • 2021-03-21
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多