【问题标题】:How do i loop through given two dates by hours in bash script我如何在bash脚本中按小时循环遍历给定的两个日期
【发布时间】:2021-03-09 04:08:32
【问题描述】:

我想按小时循环遍历两个给定的日期。 假设两个日期是 start-2021-01-01_00 end 2021-01-01_23 它会像每小时一样打印一次

2021-01-01_00

2021-01-01_01

...

2021-01-01_22

2021-01-01_23 等

【问题讨论】:

  • 什么平台? OSX(例如)对 linux/gnu 有不同的日期选项。
  • unix 和 linux。 @MrR

标签: bash shell


【解决方案1】:

假设您的date 命令支持-d 选项,请您尝试一下:

#!/bin/bash

# convert yyyy-mm-dd_hh string into seconds since epoch
str2epoch() {
    date -d "${1/_/ }" +%s
}
start="2021-01-01_00"
end="2021-01-01_23"

for (( i = $(str2epoch "$start"); i <= $(str2epoch "$end"); i+=3600 )); do
    date -d "@$i" +%y-%m-%d_%H
done

【讨论】:

    【解决方案2】:

    不同的平台有不同版本的 date 命令 - 所以实际的命令可能会略有不同(BSD/OSX 下面的示例以 UTC 给出结果)。

    基本思想是将开始和结束日期/时间设为自 epoc 以来的秒数 - 然后您可以使用简单的 for 循环为每小时添加 +3600。

    然后你可以做一个简单的for循环..例如

    DATEB4=0      # 1/1/1970 00:00 GMT
    DATEAF=176400 # 3/1/1970 01:00 GMT
    
    CURR=$DATEB4
    while [[ "$CURR" -le "$DATEAF" ]]; do
      date -r "$CURR" -u
      let CURR=$CURR+3600
    done 
    

    当然,这不适用于闰秒,以及其他一些情况......

    这是一些输出

    Thu  1 Jan 1970 00:00:00 UTC
    Thu  1 Jan 1970 01:00:00 UTC
    Thu  1 Jan 1970 02:00:00 UTC
    Thu  1 Jan 1970 03:00:00 UTC
    ....
    Fri  2 Jan 1970 18:00:00 UTC
    Fri  2 Jan 1970 19:00:00 UTC
    Fri  2 Jan 1970 20:00:00 UTC
    Fri  2 Jan 1970 21:00:00 UTC
    Fri  2 Jan 1970 22:00:00 UTC
    Fri  2 Jan 1970 23:00:00 UTC
    Sat  3 Jan 1970 00:00:00 UTC
    Sat  3 Jan 1970 01:00:00 UTC
    

    把有趣的格式留给你..

    【讨论】:

    • linux - 尝试date -d '@2147483647' 获取 gnu 日期(接近日期 -r 但不完全相同)。
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多