分钟循环并使用Bash回显

4
我希望能够遍历一个月中的所有分钟(目的是生成CSV文件)。
但当我尝试以下代码时:
d="2016-09-01 00:00:00"
 while [ "$d" != "2016-09-30 00:00:00" ]; do
 echo $d 
 d=$(date --utc "+%Y-%m-%d %H:%M:00" -d "$d + 1 minute" )
done

小时和分钟都在递增:

2016-09-01 00:00:00
2016-09-01 01:01:00
2016-09-01 02:02:00
2016-09-01 03:03:00
2016-09-01 04:04:00
2016-09-01 05:05:00
2016-09-01 06:06:00
2016-09-01 07:07:00
2016-09-01 08:08:00

我做错了什么,如何正确地循环分钟?

有趣的是,当我运行这段代码时,小时数递减而分钟数递增。你在哪个时区?我怀疑--utc只适用于输出,而不适用于日期算术运算。 - chepner
是的,"+" 符号并不像人们想象的那样起作用。尝试仅使用 + 分钟 或仅使用 分钟,以及仅使用 + 1+会在时间上添加偏移量。不要使用 +,只需将增量放置在后面,例如 $d 10分钟 - 123
3个回答

0

我会使用Unix时间戳。

d=$(date --utc +%s -d "2016-09-01 00:00:00")
end=$(date --utc +%s -d "2016-09-30 00:00:00")
while [ "$d" != "$end" ]; do
    date --utc "+%Y-%m-%d %H:%M:00" -d "@$d"
    d=$(( d + 60 ))
done

0
你可以在日期字符串变量 $d 后添加时区UTC以获得正确的输出:
d="2016-09-01 00:00:00"
for ((i=0; i<=60; i++)); do
   date --utc -d "$d UTC + $i minute"
done

Thu Sep  1 00:00:00 UTC 2016
Thu Sep  1 00:01:00 UTC 2016
Thu Sep  1 00:02:00 UTC 2016
Thu Sep  1 00:03:00 UTC 2016
Thu Sep  1 00:04:00 UTC 2016
Thu Sep  1 00:05:00 UTC 2016
...
...
Thu Sep  1 00:55:00 UTC 2016
Thu Sep  1 00:56:00 UTC 2016
Thu Sep  1 00:57:00 UTC 2016
Thu Sep  1 00:58:00 UTC 2016
Thu Sep  1 00:59:00 UTC 2016
Thu Sep  1 01:00:00 UTC 2016

请注意在$d后使用UTC


0

在日期字符串中的时间组件后使用+是用于“时区校正”,而不是用于您想要执行的操作。有趣的是,倒置日期和时间可以起到作用:

$ date  "+%Y-%m-%d %H:%M:00" -d "21:31:00 2016-09-03 + 1 minute  "
2016-09-03 21:32:00

而另一种方式则会涉及到时区和偏移量,因此结果可能取决于您的本地配置:

$ TZ=Europe/London date  "+%Y-%m-%d %H:%M:00" -d "2016-09-03 21:32:00 + 1 minute "
2016-09-03 21:33:00
$ TZ=Europe/Brussels date  "+%Y-%m-%d %H:%M:00" -d "2016-09-03 21:32:00 + 1 minute "
2016-09-03 22:33:00
$ TZ=Asia/Singapore date  "+%Y-%m-%d %H:%M:00" -d "2016-09-03 21:32:00 + 1 minute "
2016-09-04 04:33:00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接