使用日期和 bash 減去時間
SE 網路上的所有其他問題都處理假設日期為
now
( Q ) 或僅指定日期 ( Q ) 的情況。我想要做的是提供一個日期和時間,然後從中減去一個時間。
這是我首先嘗試的:
date -d "2018-12-10 00:00:00 - 5 hours - 20 minutes - 5 seconds"
這導致
2018-12-10 06:39:55
- 它增加了 7 小時。然後減去 20:05 分鐘。在閱讀了
man
和info
頁面之後date
,我想我已經修復了它:date -d "2018-12-10T00:00:00 - 5 hours - 20 minutes - 5 seconds"
但是,同樣的結果。它甚至從哪裡得到 7 小時?
我也嘗試了其他日期,因為我想也許那天我們有 7200 閏秒,誰知道哈哈。但同樣的結果。
再舉幾個例子:
$ date -d "2018-12-16T00:00:00 - 24 hours" +%Y-%m-%d_%H:%M:%S 2018-12-17_02:00:00 $ date -d "2019-01-19T05:00:00 - 2 hours - 5 minutes" +%Y-%m-%d_%H:%M:%S 2019-01-19_08:55:00
但在這裡它變得有趣。如果我省略輸入時間,它可以正常工作:
$ date -d "2018-12-16 - 24 hours" +%Y-%m-%d_%H:%M:%S 2018-12-15_00:00:00 $ date -d "2019-01-19 - 2 hours - 5 minutes" +%Y-%m-%d_%H:%M:%S 2019-01-18_21:55:00 $ date --version date (GNU coreutils) 8.30
我錯過了什麼?
**更新:**我在
Z
最後添加了一個,它改變了行為:$ date -d "2019-01-19T05:00:00Z - 2 hours" +%Y-%m-%d_%H:%M:%S 2019-01-19_04:00:00
不過我還是很困惑。關於日期的GNU 資訊頁面中沒有太多關於此的內容。
我猜這是一個時區問題,但在ISO 8601上引用了 The Calendar Wiki:
如果沒有給出帶有時間表示的 UTC 關係資訊,則假定時間為本地時間。
這就是我想要的。我的當地時間也設置正確。在我提供日期時間並想從中減去一些東西的簡單情況下,我不確定為什麼日期會完全混淆時區。它不應該先從日期字元串中減去小時數嗎?即使它確實先將其轉換為日期然後進行減法,如果我省略任何減法,我就會得到我想要的:
$ date -d "2019-01-19T05:00:00" +%Y-%m-%d_%H:%M:%S 2019-01-19_05:00:00
因此,如果這確實是一個時區問題,那麼這種瘋狂從何而來?
最後一個範例應該為您澄清了一些事情:timezones。
$ TZ=UTC date -d "2019-01-19T05:00:00Z - 2 hours" +%Y-%m-%d_%H:%M:%S 2019-01-19_03:00:00 $ TZ=Asia/Colombo date -d "2019-01-19T05:00:00Z - 2 hours" +%Y-%m-%d_%H:%M:%S 2019-01-19_08:30:00
由於輸出明顯因時區而異,我懷疑在未指定時區的時間字元串中採用了一些不明顯的預設值。測試幾個值,它似乎是UTC-05:00,但我不確定那是什麼。
$ TZ=UTC date -d "2019-01-19T05:00:00 - 2 hours" +%Y-%m-%d_%H:%M:%S%Z 2019-01-19_08:00:00UTC $ TZ=UTC date -d "2019-01-19T05:00:00Z - 2 hours" +%Y-%m-%d_%H:%M:%S%Z 2019-01-19_03:00:00UTC $ TZ=UTC date -d "2019-01-19T05:00:00" +%Y-%m-%d_%H:%M:%S%Z 2019-01-19_05:00:00UTC
它僅在執行日期算術時使用。
這裡的問題似乎
- 2 hours
不是算術,而是時區說明符:# TZ=UTC date -d "2019-01-19T05:00:00 - 2 hours" +%Y-%m-%d_%H:%M:%S%Z --debug date: parsed datetime part: (Y-M-D) 2019-01-19 05:00:00 UTC-02 date: parsed relative part: +1 hour(s) date: input timezone: parsed date/time string (-02) date: using specified time as starting value: '05:00:00' date: starting date/time: '(Y-M-D) 2019-01-19 05:00:00 TZ=-02' date: '(Y-M-D) 2019-01-19 05:00:00 TZ=-02' = 1547881200 epoch-seconds date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns), date: new time = 1547884800 epoch-seconds date: timezone: TZ="UTC" environment value date: final: 1547884800.000000000 (epoch-seconds) date: final: (Y-M-D) 2019-01-19 08:00:00 (UTC) date: final: (Y-M-D) 2019-01-19 08:00:00 (UTC+00) 2019-01-19_08:00:00UTC
因此,不僅沒有進行算術運算,而且時間似乎有 1 小時的夏令時調整,導致我們的時間有點荒謬。
這也適用於添加:
# TZ=UTC date -d "2019-01-19T05:00:00 + 5:30 hours" +%Y-%m-%d_%H:%M:%S%Z --debug date: parsed datetime part: (Y-M-D) 2019-01-19 05:00:00 UTC+05:30 date: parsed relative part: +1 hour(s) date: input timezone: parsed date/time string (+05:30) date: using specified time as starting value: '05:00:00' date: starting date/time: '(Y-M-D) 2019-01-19 05:00:00 TZ=+05:30' date: '(Y-M-D) 2019-01-19 05:00:00 TZ=+05:30' = 1547854200 epoch-seconds date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns), date: new time = 1547857800 epoch-seconds date: timezone: TZ="UTC" environment value date: final: 1547857800.000000000 (epoch-seconds) date: final: (Y-M-D) 2019-01-19 00:30:00 (UTC) date: final: (Y-M-D) 2019-01-19 00:30:00 (UTC+00) 2019-01-19_00:30:00UTC
再調試一下,解析似乎是:(
2019-01-19T05:00:00 - 2
作為-2
時區)和hours
(= 1 小時),隱含添加。更容易查看是否使用分鐘來代替:# TZ=UTC date -d "2019-01-19T05:00:00 - 2 minutes" +%Y-%m-%d_%H:%M:%S%Z --debug date: parsed datetime part: (Y-M-D) 2019-01-19 05:00:00 UTC-02 date: parsed relative part: +1 minutes date: input timezone: parsed date/time string (-02) date: using specified time as starting value: '05:00:00' date: starting date/time: '(Y-M-D) 2019-01-19 05:00:00 TZ=-02' date: '(Y-M-D) 2019-01-19 05:00:00 TZ=-02' = 1547881200 epoch-seconds date: after time adjustment (+0 hours, +1 minutes, +0 seconds, +0 ns), date: new time = 1547881260 epoch-seconds date: timezone: TZ="UTC" environment value date: final: 1547881260.000000000 (epoch-seconds) date: final: (Y-M-D) 2019-01-19 07:01:00 (UTC) date: final: (Y-M-D) 2019-01-19 07:01:00 (UTC+00) 2019-01-19_07:01:00UTC
所以,好吧,日期算術正在完成,而不是我們要求的那個。¯(ツ)/¯