嘿,我觉得我可能有点愚蠢,但我似乎无法在任何地方找到如何利用其中带有符号的序列。
我希望能够运行两个日期和时间的序列: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
版本不支持定义输入字符串格式。