Date

date-d / --date= 選項一起使用

  • May 5, 2021

我想用來date為我的樹莓派上的實時時鐘計算一些未來的“鬧鐘時間”。這些“警報時間”將用於“喚醒”RPi。

我決定使用的方案如下:

  1. 啟動後,我立即以我選擇的格式獲得目前的“基線”時間:
$ BASETIME=$(date "+%D %X")
$ echo $BASETIME
05/03/21 14:03:43
  1. 之前shutdown,我需要從“基線”時間計算至少一個“喚醒警報時間”;例如,距基準時間 6 小時。據我了解,-dor--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

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