Date

使用 linux ‘date’ 命令建構每天 6 小時的日期系列(每天 4 個時間步長)

  • September 9, 2020

我正在嘗試建構一個每天 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:這是一種明確的日期格式,它按詞彙和時間順序排序。

引用自:https://unix.stackexchange.com/questions/608409