创建数字中包含 _ 的序列

创建数字中包含 _ 的序列

嘿,我觉得我可能有点愚蠢,但我似乎无法在任何地方找到如何利用其中带有符号的序列。

我希望能够运行两个日期和时间的序列:20191110_2330和,20191111_0200但我搞不懂如何读取_。任何建议都将不胜感激。

答案1

可能有点矫枉过正,但我​​能够使用以下 bash 函数和 GNU date(1) 来完成此任务:

seq_dates () {
    local Y1 M1 D1 d1
    local r
    local m=0
    Y1=${1:0:4}
    M1=${1:4:2}
    D1=${1:6:2}
    d1="${Y1}-${M1}-${D1} ${1: -4}"
    until [[ $r == $2 ]]; do
        r=$($date -d "$d1 + $m minutes" '+%Y%m%d_%H%M')
        printf '%s\n' "$r"
        ((m++))
    done
}

你会这样称呼它:

seq_dates 20191110_2330 20191111_0200

它将输入的开始日期转换为 GNU 日期可用的格式,然后运行一个循环,每次向日期添加 1 分钟,直到等于给定的结束日期。

笔记: 如果给定的结束日期早于给定的开始日期,这将运行无限循环。

答案2

对于循环日期,只需定义开始和结束并循环所有所需的时间步长。

只需使用纪元时间作为开始和结束,并在每次迭代时添加 60 秒或所需的步长。然后根据需要设置输出格式。

#!/bin/bash
start=$(date -d2019-11-10T23:30 +%s)
end=$(date -d2019-11-11T02:00 +%s)
ddate="$start"

while [ $ddate -le $end ] ; do
   date -d@"$ddate" +%Y%m%d_%H%M
   ddate=$((ddate+60))
done

如果您想将日期字符串转换为命令可读的格式date,只需使用sed

 echo 20191110_2030 | sed 's/\(....\)\(..\)\(..\)_\(..\)\(..\)/\1-\2-\3T\4:\5/'

不幸的是,大多数date版本不支持定义输入字符串格式。

相关内容