bash 中的日期和时间循环

bash 中的日期和时间循环

我正在尝试通过外部 API 下载昨天的日志,对于 API,我需要提供从 & 到 的日期范围作为输入参数。

从 API 我可以为每次调用下载最多 1 小时的日志。

所以如果我想下载昨天的完整日志。我需要以昨天的日期(每小时一次)调用 API 24 次。

注意 API 仅支持 GMT 时间。所以需要提供GMT时间。

例如:-https://abcd.com/logs?start=从日期&结束=迄今为止

  1. 第一次循环它应该像下面这样,
  2. https://abcd.com/logs?start=29-04-2018T00:00:00Z&结束=29-04-2018T00:59:59Z
  3. 第二次循环它应该像下面这样
  4. https://abcd.com/logs?start=29-04-2018T01:00:00Z&结束=29-04-2018T01:59:59Z
  5. 最后一次循环像下面这样,
  6. https://abcd.com/logs?start=29-04-2018T23:00:00Z&结束=29-04-2018T23:59:59Z

我将把这个脚本添加到 cron 计划中,这样每天它就会被触发并下载昨天的 24 小时日志完成。

关键点是

  1. 总是昨天的日期
  2. 格式 GMT
  3. 24次循环

下面提到的答案会引发错误。我从这个脚本开始,它考虑当前时间并执行循环。相反,该循环需要从 GMT 时间 00:00:00 开始。

#!/bin/bash
FROM_DATE=$(date -u -d "1 day ago" +%Y-%m-%d"T"%H":00:00""Z")
for i in {0..3}
  do
    echo "FROM_DATE : $FROM_DATE"
    TO_DATE=$(date -u +%Y-%m-%d"T"%H":59:59""Z" -d "1 day ago""$date + $i hour")
    echo "TO_DATE : $TO_DATE"
    FROM_DATE=$(date -u +%Y-%m-%d"T"%H":00:00""Z" -d "1 day ago""$date + $i hour""$date + 1 hour")
  done

答案1

尝试这个。

#!/bin/bash
#
yesterday=$(date --utc --date 'yesterday' +'%Y-%m-%d')
for hour in {0..23}
do
    printf "https://abcd.com/logs?start=%sT%02d:00:00Z&end=%sT%02d:59:59Z\n" $yesterday $hour $yesterday $hour
done

它无法处理偶尔的闰秒。如果您需要这样做,请使用此更复杂的代码,其中当天的最后一个范围可能需要从 到23:00:0023:59:60但请确保您的目标应用程序也可以处理此问题:

#!/bin/bash
#
yesterday=$(date --utc --date 'yesterday' +'%Y-%m-%d')
leapsecond=$(date --utc --date @$(( $(date --utc --date '00:00:00' +%s) -1 )) +'%S')
lastsecond=59

for hour in {0..23}
do
    [[ hour == 23 ]] && lastsecond=$leapsecond
    printf "https://abcd.com/logs?start=%sT%02d:00:00Z&end=%sT%02d:59:%02dZ\n" $yesterday $hour $yesterday $hour $lastsecond
done

答案2

我得到了预期的输出。

#!/bin/bash
for i in {00..23}
do FROM_DATE=$(date -u -d "1 day ago" +%Y-%m-%d"T"$i":00:00Z")
echo "FROM_DATE:" $FROM_DATE | tr -d '\r'
TO_DATE=$(date -u +%Y-%m-%d"T"$i":59:59Z" -d "1 day ago")
echo "TO_DATE : $TO_DATE" | tr -d '\r'
done

非常感谢你的帮助

相关内容