Linux "date"コマンドを使用して、6時間の1日の日付シリーズ(1日4時間ステップ)を構築します。

Linux "date"コマンドを使用して、6時間の1日の日付シリーズ(1日4時間ステップ)を構築します。

「N」年間、毎日6時間分の出会い系列を構成しようとしています。私はこれをしようとします

for i in {1..1825}; do 
date -d "00:00 01-01-1998 +6 hours" +"%d-%m-%Y %H:%M"
done

しかし、それは私が望むものではありません。

私の目標はこれを順番に作ることです。

01-01-1998 00:00 
01-01-1998 06:00 
01-01-1998 12:00 
01-01-1998 18:00 
02-01-1998 00:00 
02-01-1998 06:00
02-01-1998 12:00 
02-01-1998 18:00 
.
.
.etc

コマンドを使用してこれをどのようにdate実行できますか?

どんな助けでも大変感謝します。よろしくお願いします。

答え1

夏時間を心配する必要があります。たとえば、私のタイムゾーンはカナダ/東部で、次のようになります。

$ d=$(date -d "2020-03-08 00:00:00")
$ echo $d
Sun Mar 8 00:00:00 EST 2020
$ d=$(date -d "$d + 6 hours")
$ echo $d
Sun Mar 8 07:00:00 EDT 2020
# ........^^

そして

$ d=$(date -d "2020-11-01 00:00:00")
$ echo $d
Sun Nov 1 00:00:00 EDT 2020
$ d=$(date -d "$d + 6 hours")
$ echo $d
Sun Nov 1 05:00:00 EST 2020
# ........^^

タイムゾーンにUTCを指定する必要があります。

$ d=$(date -u -d "2020-11-01 00:00:00")
$ echo $d
Sun Nov 1 00:00:00 UTC 2020
$ d=$(date -u -d "$d + 6 hours")
$ echo $d
Sun Nov 1 06:00:00 UTC 2020
# ........^^

だから:

fmt='%d-%m-%Y %H:%M'
d=$(date -u -d "1998-01-01 00:00:00")
for i in {1..1825}; do 
    # print the current date
    date -u -d "$d" "+$fmt"
    # add 6 hours
    d=$(date -u -d "$d + 6 hours")
done

ISO日付形式YYYY-mm-ddを使用することをお勧めします。これは明確な日付形式で、語彙と時系列でソートされます。

答え2

計算された各日付を変数に保存し、それを使用して次の日付を計算できます。date指定した形式を解析できないため、標準ロケールのデフォルト形式を使用して日付を保存しています。

# start date
d=$(LC_ALL=C date -d "1998-01-01 00:00")
echo "# d=$d"
# convert format
date -d "$d" +"%d-%m-%Y %H:%M"

for i in {1..1825}; do 
    # add 6 hours
    d=$(LC_ALL=C date -d "$d +6 hours")
    # convert format
    date -d "$d" +"%d-%m-%Y %H:%M"
done

この印刷

# d=Thu Jan  1 00:00:00 CET 1998
01-01-1998 00:00
01-01-1998 06:00
01-01-1998 12:00
01-01-1998 18:00
02-01-1998 00:00
02-01-1998 06:00
02-01-1998 12:00
02-01-1998 18:00
03-01-1998 00:00
03-01-1998 06:00
03-01-1998 12:00
03-01-1998 18:00
04-01-1998 00:00
04-01-1998 06:00
...

結果は時間帯と夏時間の規則に依存します。

開始時間の指定はタイムゾーンを指定しないため、あいまいにすることができます。

編集するに基づいてポール・ペダント次のコメント:

+ $i 日間の外部ループとハードコーディングされた 00、06、12、18 の内部ループを作成します。四半期の日付プロセスを実行し、DSTの変更に興味がありません。

# start date
d=$(LC_ALL=C date -d "1998-01-01 00:00")
echo "# d=$d"

for i in {1..456}; do 
    # convert (partial) format
    out=$(date -d "$d" +"%d-%m-%Y")
    for h in 00 06 12 18; do
        echo "$out $h:00"
    done
    # add 1 day
    d=$(LC_ALL=C date -d "$d +1 day")
done

一般時間と夏時間を切り替える際に予想される事項について質問に具体的に記載してください。 (DSTに切り替える場合は、厳密に00:00、06:00、12:00、18:00、または正確に6時間を印刷します。)

編集するに基づいてグレンジャックマン~の回答

-uすべての呼び出しにオプションを追加すると、dateスクリプトはGlenn Jackmanによって書かれたスクリプトとほぼ同じになり、夏時間にかかわらず厳密に00:00、06:00、12:00、18:00と印刷されます.

答え3

GNUを使用すると、date開始点に時間を増やすことができます

start="$(date +'%Y-%m-%d')"
for i in {0..1825}
do
    date --date "$start +$((i*6)) hours" +'%d-%m-%Y %H:%M'
done

6時間間隔は変わりませんが、現在の場所(イギリスのタイムゾーン)により、夏時間と冬時間の間の移行により実際の時間が変わります。

24-10-2020 00:00
24-10-2020 06:00
24-10-2020 12:00
24-10-2020 18:00
25-10-2020 00:00
25-10-2020 05:00    ← Six hours on from midnight because the clock goes back one hour at 03:00
25-10-2020 11:00
25-10-2020 17:00
25-10-2020 23:00

間隔を真夜中、午前6時、正午、午後6時(夏/冬の間の可能な切り替えに関係なく)に設定するか、間隔を正確に6時間間隔に固定するかは質問に指定されていません。

date --utc代わりに、date時間帯に関係なく、一連の日時が6時間間隔で表示されるようにすることができます。

関連情報