Vic*_*rov 7 date ubuntu-16.04 ubuntu-18.04
我date
在 Ubuntu 18.04 中发现了程序的奇怪行为。
因此,我认为date
应该使用--date option
并正确处理 +N 分钟:
date --date "2019-01-01 13:43:32 +1 minutes" "+%Y-%m-%d %H:%M:%S"
Run Code Online (Sandbox Code Playgroud)
但是,在 Ubuntu 16.04 中,我会得到:
2019-01-01 13:44:32
Run Code Online (Sandbox Code Playgroud)
在 18.04 中:
2019-01-01 12:44:32
Run Code Online (Sandbox Code Playgroud)
解决方案也是添加+1 hours
,但是,等一下,为什么当我加一分钟时我会得到减一小时?
这里的问题date
是将+1
部分视为时区,而不是额外的一分钟。额外的分钟仅来自minutes
被解析为“增加一分钟”的单词,因为它不清楚。
如果您尝试以下命令,您可以看到这一点:
您的原始命令被解释为“在时区 UTC +1”。
$ date --date "2019-01-01 13:43:32 +1 minutes" "+%Y-%m-%d %H:%M:%S"
2019-01-01 12:44:32
Run Code Online (Sandbox Code Playgroud)更改为+2
并注意小时减一但分钟保持不变。这被解释为“在时区 UTC +2”。
$ date --date "2019-01-01 13:43:32 +2 minutes" "+%Y-%m-%d %H:%M:%S"
2019-01-01 11:44:32
Run Code Online (Sandbox Code Playgroud)请注意,仅使用+1
(without minutes
) 会给出仅更改小时而不是分钟的行为。
$ date --date "2019-01-01 13:43:32 +1" "+%Y-%m-%d %H:%M:%S"
2019-01-01 12:43:32
Run Code Online (Sandbox Code Playgroud)观察这个词minutes
被解释为增加一分钟。
$ date --date "2019-01-01 13:43:32 minutes" "+%Y-%m-%d %H:%M:%S"
2019-01-01 13:44:32
Run Code Online (Sandbox Code Playgroud)从info date
命令输出中,部分21.1.6 Options for ‘date’
:
Run Code Online (Sandbox Code Playgroud)... For example, ‘--date="2004-02-27 14:19:13.489392193 +0530"’ specifies the instant of time that is 489,392,193 nanoseconds after February 27, 2004 at 2:19:13 PM in a time zone that is 5 hours and 30 minutes east of UTC. ...
请注意使用+530
来描述时区。
从info date
命令输出中,部分28.7 Relative items in date strings
:
Run Code Online (Sandbox Code Playgroud)... The unit of time may be preceded by a multiplier, given as an optionally signed number. Unsigned numbers are taken as positively signed. No number at all implies 1 for a multiplier. Following a relative item by the string ‘ago’ is equivalent to preceding the unit by a multiplier with value -1. ...
请注意文本:“根本没有数字意味着乘数为 1”。
一种选择是颠倒字符串元素的顺序:
$ date --date "+1 minutes 2019-01-01 13:43:32" "+%Y-%m-%d %H:%M:%S"
2019-01-01 13:44:32
Run Code Online (Sandbox Code Playgroud)
另一个选项(我更喜欢的选项)是明确指定时区:
$ date --date "2019-01-01 13:43:32 UTC +1 minutes" "+%Y-%m-%d %H:%M:%S"
2019-01-01 13:44:32
Run Code Online (Sandbox Code Playgroud)
(请注意,您也可以使用+0
或Z
作为UTC
上面字符串中的替代方法。)
另请注意,如果您使用的是date
8.26 或更高版本(如 Ubuntu 18.04;16.04 使用的是 8.25),您可以添加--debug
标志 fordate
来告诉您它如何解析输入文本:
$ date --date "2019-01-01 13:43:32 +1 minutes" --debug "+%Y-%m-%d %H:%M:%S"
date: parsed date part: (Y-M-D) 2019-01-01
date: parsed time part: 13:43:32 UTC+01
date: parsed relative part: +1 minutes
date: input timezone: parsed date/time string (+01)
date: using specified time as starting value: '13:43:32'
date: starting date/time: '(Y-M-D) 2019-01-01 13:43:32 TZ=+01'
date: '(Y-M-D) 2019-01-01 13:43:32 TZ=+01' = 1546346612 epoch-seconds
date: after time adjustment (+0 hours, +1 minutes, +0 seconds, +0 ns),
date: new time = 1546346672 epoch-seconds
date: timezone: system default
date: final: 1546346672.000000000 (epoch-seconds)
date: final: (Y-M-D) 2019-01-01 12:44:32 (UTC)
date: final: (Y-M-D) 2019-01-01 12:44:32 (UTC+00)
2019-01-01 12:44:32
Run Code Online (Sandbox Code Playgroud)
对比
$ date --date "+1 minutes 2019-01-01 13:43:32" --debug "+%Y-%m-%d %H:%M:%S"
date: parsed relative part: +1 minutes
date: parsed date part: (Y-M-D) 2019-01-01
date: parsed time part: 13:43:32
date: input timezone: system default
date: using specified time as starting value: '13:43:32'
date: starting date/time: '(Y-M-D) 2019-01-01 13:43:32'
date: '(Y-M-D) 2019-01-01 13:43:32' = 1546350212 epoch-seconds
date: after time adjustment (+0 hours, +1 minutes, +0 seconds, +0 ns),
date: new time = 1546350272 epoch-seconds
date: timezone: system default
date: final: 1546350272.000000000 (epoch-seconds)
date: final: (Y-M-D) 2019-01-01 13:44:32 (UTC)
date: final: (Y-M-D) 2019-01-01 13:44:32 (UTC+00)
2019-01-01 13:44:32
Run Code Online (Sandbox Code Playgroud)
最后一点:我不知道你为什么在 16.04 上得到不同的输出。在我的 16.04 机器上,我得到与 18.04 机器相同的结果。我还查看了 GNU coreutils 的 git 历史,我没有看到任何明显会导致这种变化的提交。
归档时间: |
|
查看次数: |
163 次 |
最近记录: |