ねえ、私は少し愚かなようですが、シンボルを含むシーケンスを活用する方法をどこにも見つけることができないようです。
2つの日付と時刻のシーケンスを実行できるようにしたいのです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 Dateで利用可能な形式に変換し、指定された終了日と等しくなるまで毎回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
バージョンは入力文字列形式の定義をサポートしていません。