日期數學未給出預期結果

日期數學未給出預期結果

我見過幾個例子(包括這個郵政)而且看起來很簡單,但我不太明白我做錯了什麼(我知道該帖子是針對Linux的,但我嘗試在dateLinux機器上使用該命令並在那裡得到相同的結果)

命令和輸出範例

me@mymachine~$ gdate -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

我希望結果以 開始2019-10-26。所以看起來它沒有解析我的輸入,對吧?

更奇怪的是(無論如何對我來說),如果我去掉輸入的時間部分,它就會按預期工作

me@mymachine~$ gdate -d '2019-10-19 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-26 00:00:00

答案1

分析

我在 Debian 9 中做了一些測試,研究man 1 dateinfo date.後者包含有關如何2019-10-19 01:37:02 +7 days解釋字串的更多資訊。

初步說明:

  • 我的回答使用了,date因為這是 Debian 中的工具。 (用於alias date=gdate測試我的命令,而gdate無需每次都編輯它們)。
  • 看來您的時區大致相當於TZ=UTC+4

我嘗試複製你的結果:

$ date -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 20:37:02

我的結果不同,這表明時區很重要。要真正複製您的結果:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

解釋

事實證明+7,您的“行為不當”命令被解釋為UTC+7並被days解釋為+1 days。比較:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+7 +1 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

(註TZ=UTC+4是指UTC-04:00whileUTC+7在字串中意味著世界標準時間+07:00。與標誌不一致的情況已得到解釋這裡.)

神秘的結果現在不再那麼神秘了。


怪癖

真正奇怪的是:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-25 21:37:02

顯然它不是UTC+7and days(含義+1 days如上)而是UTC(含義UTC+0) and +7 days

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+0 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-25 21:37:02

解決方案

+7 days子字串移向開頭,使其出現在 之前01:37:02。這種方式+7不會被解釋為UTC+7

$ date -d '2019-10-19 +7 days 01:37:02' +"%Y-%m-%d %H:%M:%S"
2019-10-26 01:37:02

現在01:37:02,輸入字串根據任何date認為正確的時區進行解釋。結果*對於歐洲的我、美國、澳洲等任何地方的其他使用者來說應該是一樣的。這就是我放棄的原因TZ=UTC+4,現在已經不重要了。

*我的意思是字串印製的date應該是相同的。不同的使用者會在不同的時區解釋同一個字串,他們在現實中會得到不同的時刻。從這個意義上說,他們的結果是不同的。從同樣的意義上說,他們的輸入是不同的。

相關內容