【问题标题】:Loop minutes and echo with bash循环分钟并用 bash 回显
【发布时间】:2017-02-26 12:35:55
【问题描述】:

我想迭代一个月内的所有分钟(目的是生成一个 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 仅适用于输出,而不适用于日期算术。
  • 是的,+ 号与人们的想法不同。试试+ minuteminute,再试试+ 1+ 在时间上添加一个偏移量。不要使用+,只需将增量放在例如$d 10 minutes

标签: bash date


【解决方案1】:

我会改为使用 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

【讨论】:

    【解决方案2】:

    您可以在日期字符串变量$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

    【讨论】:

      【解决方案3】:

      在日期字符串中的时间组件之后使用+ 用于'time zone correction',而不是用于做你想做的事情。有趣的是,反转日期和时间是可行的:

      $ 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
      

      【讨论】:

        猜你喜欢
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        相关资源
        最近更新 更多