Date
使用 linux ‘date’ 命令建構每天 6 小時的日期系列(每天 4 個時間步長)
我正在嘗試建構一個每天 6 小時的日期系列,持續“N”年。我試著這樣做
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
命令執行此操作?非常感謝任何幫助。提前致謝。
您可以將每次計算的日期保存在變數中,並使用它來計算下一個日期。我使用標準語言環境中的預設格式來儲存日期,因為
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 ...
結果取決於您的時區和夏令時規則。
您的開始時間規範可能不明確,因為它沒有指定時區。
根據Paul_Pedant的評論進行編輯:
為 + $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
請在問題中指定在正常時間和夏令時之間切換時您期望的結果。(切換夏令時時嚴格列印 00:00、06:00、12:00、18:00 或正好 6 小時時差)
根據glenn jackman的回答進行編輯
-u
為所有呼叫添加選項date
將使腳本與 glenn jackman 編寫的腳本幾乎相同,並導致嚴格列印 00:00、06:00、12:00、18:00,而不管 DST。
您必須擔心夏令時。例如,我的時區是加拿大/東部,並且:
$ 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:這是一種明確的日期格式,它按詞彙和時間順序排序。