Date將
將 date
與 -d
/ --date=
選項一起使用
我想用來
date
為我的樹莓派上的實時時鐘計算一些未來的“鬧鐘時間”。這些“警報時間”將用於“喚醒”RPi。我決定使用的方案如下:
- 啟動後,我立即以我選擇的格式獲得目前的“基線”時間:
$ BASETIME=$(date "+%D %X") $ echo $BASETIME 05/03/21 14:03:43
- 之前
shutdown
,我需要從“基線”時間計算至少一個“喚醒警報時間”;例如,距基準時間 6 小時。據我了解,-d
or--date=
選項用於此目的,但我沒有得到正確的結果:$ date '+%D %X' -d "${BASETIME} + 6 hours" 05/03/21 04:03:43
結果過去了!?- 這顯然是不正確的(至少不是我想要的 :) 徹底閱讀
man date
沒有任何啟示;它建議:日期字元串格式比這裡容易記錄的要復雜…
和
完整的文件
$$ … $$可通過以下方式在本地獲得:
info '(coreutils) date invocation'
但我在這裡也沒有發現任何有用的東西。
一個接近的替代方案是:
$ date "+%D %X" -d '+ 6 hours' 05/03/21 10:10:11
我可以通過這種方式獲得正確的鬧鐘時間,但這是相對於目前時間,而不是 BASETIME。
我的問題是:
- 為什麼
date '+%D %X' -d "${BASETIME} + 6 hours"
減少時間而不是增加時間?- 從固定的 BASETIME 遞增的正確方法是什麼?
注意:FWIW、我的作業系統、核心和
date
版本:$ date --version date (GNU coreutils) 8.30 ... $ hostnamectl ... Operating System: Raspbian GNU/Linux 10 (buster) Kernel: Linux 5.10.17-v7+ ...
核心問題是創建的日期字元串
BASETIME=$(date "+%D %X")
不包含時區。使用BASETIME=$(date "+%D %X %z")
將解決您的問題..使用
date '+%D %X' -d "${basetime} + 6 hours"
,+ 6
(或+6
或+06
等)被解釋為時區值。您可以使用GNU
date
--debug
選項(我的粗體)看到它:$ date '+%D %X %z' -d "${basetime} + 6 hours" --debug date: warning: value 5 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0021-05-03 date: **parsed time part: 14:03:43 UTC+06** date: parsed relative part: +1 hour(s) date: input timezone: parsed date/time string (+06) date: warning: adjusting year value 21 to 2021 date: using specified time as starting value: '14:03:43' date: starting date/time: '(Y-M-D) 2021-05-03 14:03:43 TZ=+06' date: '(Y-M-D) 2021-05-03 14:03:43 TZ=+06' = 1620029023 epoch-seconds date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns), date: new time = 1620032623 epoch-seconds date: timezone: system default date: final: 1620032623.000000000 (epoch-seconds) date: final: (Y-M-D) 2021-05-03 09:03:43 (UTC) date: final: (Y-M-D) 2021-05-03 05:03:43 (UTC-04) 05/03/21 05:03:43 AM -0400
此外,小時字被解釋為“加 1 小時”。
如果您使用 TimeZone 值作為您的時間,所有問題都會得到解決。
我建議使用
%F %T %z
格式:$ basetime=$(date "+%F %T %z"); echo "$basetime" 2021-05-03 18:31:43 -0400 $ date '+%F %T %z' -d "${basetime} + 6 hours" 2021-05-04 00:31:43 -0400
這確實是在未來。它仍然可以使用 –debug 選項執行。
避免時區(我不推薦)的解決方法是將相對項(
+6 hours
)放在靜態時間值之前:$ date -d "+6 hours 2021-05-03 18:31:43" Tue 04 May 2021 12:31:43 AM EDT