代码之家  ›  专栏  ›  技术社区  ›  user2531569

unix中的小时值循环

  •  0
  • user2531569  · 技术社区  · 7 年前

    now=2018100600
    end=2018100804
    while [ "$now" != "$end" ] ;
    do
            now=`date +"%Y%m%d%H" -d "$now + 1 hour"`;
            echo $now
    done
    

    上述脚本的预期输出为20181006012018100602,…2018100804

    我的日期有误: invalid date ‘-53382311010101 + 1 hour' .

    3 回复  |  直到 7 年前
        1
  •  1
  •   KamilCuk    7 年前

    我认为最好以格式给出GNU日期 YYYY-mm-dd HH-MM-SS . 他不断曲解输入日期的格式。如果您有一个openbsd日期版本(我喜欢),您可以指定输入字符串字段。

    这样做有效:

    now=2018100600
    end=2018100604
    while (( now < end )); do
            now=$(
                date --date="${now:0:4}-${now:4:2}-${now:6:2} ${now:8:2}:00:00 +hour" +%Y%02m%02d%02H
            )
            echo "$now"
    done
    

    但我还是觉得使用时间戳更安全:

    now_timestamp=$(date --date="${now:0:4}-${now:4:2}-${now:6:2} ${now:8:2}:00:00" +%s)
    end_timestamp=$(date --date="${end:0:4}-${end:4:2}-${end:6:2} ${end:8:2}:00:00" +%s)
    for ((i = now_timestamp; i < end_timestamp; i += 60 * 60)); do
        now=$(date --date="@$i" +%Y%02m%02d%02H)
        echo "$now"
    done
    

    tutorialpoint .

        2
  •  1
  •   bobah    7 年前

    如果你换一个 + 以及 -d : date -d '2018100602 + 1 hour' '+%Y%m%d%H' ,加上它认为 2018100600

    now='20181006 00'
    end='20181008 04'
    until [[ $now == $end ]]; do
        now=$(date -d "${now} + 1 hour" '+%Y%m%d %H');
        echo $now
    done
    
        3
  •  0
  •   Igor S.K.    7 年前

    在玩过之后 date 命令一点,我就得出了下面的解决办法。你给我的日期 -d 日期 不能解释为 yyyymmddhh ,如你所愿。

    #!/bin/sh
    
    now=2018100600
    end=2018100604
    
    nowY=$(expr "$now" : "\([[:digit:]]\{4\}\)")
    nowM=$(expr "$now" : "[[:digit:]]\{4\}\([[:digit:]]\{2\}\)")
    nowD=$(expr "$now" : "[[:digit:]]\{4\}[[:digit:]]\{2\}\([[:digit:]]\{2\}\)")
    nowH=$(expr "$now" : "[[:digit:]]\{4\}[[:digit:]]\{2\}[[:digit:]]\{2\}\([[:digit:]]\{2\}\)")
    
    h_counter="$nowH"
    ((h_counter++))
    date_runner=""
    while true ; do
        date_runner=$(date -d "$nowY$nowM$nowD + $h_counter hours" +"%Y%m%d%H")
        echo $date_runner
        ((h_counter++))
        [ "$date_runner" == "$end" ] && break
    done
    

    尽管我认为@Kamil Cuk的建议是“最好以YYYY-mm-dd-HH-mm-SS格式给出GNU仅日期的日期”。