Date

使用日期和 bash 減去時間

  • January 31, 2019

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 分鐘。

在閱讀了maninfo頁面之後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

所以,好吧,日期算術正在完成,而不是我們要求的那個。¯(ツ)/¯

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