BASH循环虽然时间

时间:2016-12-19 11:17:53

标签: bash date for-loop time increment

使用BASH我想以十分钟的间隔从开始到结束日期循环。 我试过了

begin_date="2015-01-01 00:00:00"
end_date="2015-02-20 00:00:00"
d=$begin_date
while [ "$d" != "$end_date" ]; do
    echo $d
    d=$(date -d "${d} + 10 min" +"%Y-%m-%d %H:%M")
done

但它没有用。看Bash:Looping thru dates

#This works
d=$(date -I -d "${d} + 1 day")

#This doesn't work
d=$(date -d "${d} + 1 day" +"%Y-%m-%d")

格式字符串中缺少什么?

2 个答案:

答案 0 :(得分:2)

表达式CMTime start = CMTimeMakeWithSeconds(1.0, 600); CMTime duration1 = CMTimeMakeWithSeconds(1.7, 600); CMTimeRange range = CMTimeRangeMake(kCMTimeZero, duration1); 似乎不会产生偏移量为10分钟的日期。实际上,当我运行你的代码时,我会看到一个日期计数器向后移动(将此诊断作为问题的一部分发布将有助于其他人查看问题所在;您不应该要求其他人运行您的代码只是为了看它的作用。)

无论如何,这样做的理智方法是将日期转换为Unix epoch,然后从那里取出。

date -d "${d} + 10 min"

在shell中进行日期算术可能效率很低;将其转换为例如如果觉得它太迟钝或需要多次运行,那么Awk或Perl可能值得你花时间。

答案 1 :(得分:1)

您链接的示例需要稍微调整一下:

#!/bin/bash

## User-specified dates.
# See [GNU Coreutils: Date] for more info
# [GNU Coreutils: Date]: https://www.gnu.org/software/coreutils/manual/html_node/Combined-date-and-time-of-day-items.html#Combined-date-and-time-of-day-items
begin_date="2015-01-01T00:00"
end_date="2015-01-01T00:40"

# Run through `date` to ensure iso-8601 consistency
startdate=$(date --iso-8601='minutes' --date="${begin_date}")
enddate=$(date --iso-8601='minutes' --date="${end_date}")

# Do loop
d="$startdate"
while [ "$d" != "$enddate" ]; do 
  echo $d
  d=$(date --iso-8601='minutes' --date="$d + 10 minutes")
done

请注意,选项-I-d分别相当于--iso-8601--date