在某些情况下,shell日期"-n hours"与"n hours ago"不同

Joh*_*ith 9 shell date

在shell中,当我打印这个

date -d "2016-11-23 13:05 -1 hours "  "+%Y-%m-%d %H:00:00"
Run Code Online (Sandbox Code Playgroud)

我变得很2016-11-23 23:00:00.奇怪!

当我打印这个

date -d "2016-11-23 13:05 1 hours ago"  "+%Y-%m-%d %H:00:00"
Run Code Online (Sandbox Code Playgroud)

我得到2016-11-23 12:00:00.

为什么他们不同?我认为他们都是2016-11-23 12:00:00.

Jen*_*ens 4

这是因为负数被视为您的时区的偏移量,而不是13:05. 在我的时区 MET(格林尼治标准时间以东一小时),这就是我得到的:

$ date -d "2016-11-23 13:05 -1 hours "  "+%Y-%m-%d %H:00:00"
2016-11-23 16:00:00
$ TZ=GMT date -d "2016-11-23 13:05 -1 hours "  "+%Y-%m-%d %H:00:00"
2016-11-23 15:00:00
$ TZ=GMT-1 date -d "2016-11-23 13:05 -1 hours "  "+%Y-%m-%d %H:00:00"
2016-11-23 16:00:00
$ TZ=GMT-1 date -d "2016-11-23 13:05 -2 hours "  "+%Y-%m-%d %H:00:00"
2016-11-23 17:00:00
Run Code Online (Sandbox Code Playgroud)

时区偏移量通常指定为四位数字,如下所示

Sun, 29  Feb 2004  16:21:42 -0800
Run Code Online (Sandbox Code Playgroud)

但显然 date(1) 也对 -1 感到满意。

从手册页:

日期字符串

--date=STRING 是一个大多数自由格式的人类可读日期字符串,例如“Sun, 29 Feb 2004 16:21:42 -0800”或“2004-02-29 16:21:42”甚至“下周四” 。日期字符串可以包含指示日历日期、一天中的时间、时区、星期几、相对时间、相对日期和数字的项目。空字符串表示一天的开始。日期字符串格式比此处轻松记录的更复杂,但在信息文档中有完整描述。