为什么有时间在GNU日期中断“ - 1天”?

时间:2015-07-24 23:59:30

标签: date unix gnu

这会将给定的日期时间转换为纪元时间(秒)

date -d"2015-07-24 11:29:00" +%s
// gives 1437762540

现在我想做同样的事情,但减去一天。通常,这就像添加“ - 1天”一样简单。但是,它实际上增加了一天,而不是减去一天。

date -d"2015-07-24 11:29:00 - 1 day" +%s
// gives 1437848940 (notice, this value is great than the one above)

如果我从时间戳中删除时间部分,那就很有效。然而,时间部分似乎打破了它。我知道我可以通过两个单独的步骤来完成这个并避免这个问题。但是,我希望能在一个命令中完成它。这可能吗?

2 个答案:

答案 0 :(得分:3)

date命令中有一些关于如何解释日期字符串中的- 1标记的含糊不清。它将其解析为时区规范

$ date -d "2015-07-24 11:29:00 -1"
Fri Jul 24 08:29:00 EDT 2015

$ date -d "2015-07-24 11:29:00 UTC-1"
Fri Jul 24 08:29:00 EDT 2015

$ date -d "2015-07-24 11:29:00 - 2"
Fri Jul 24 09:29:00 EDT 2015

$ date -d "2015-07-24 11:29:00 UTC-2"
Fri Jul 24 09:29:00 EDT 2015

$ TZ=UTC date -d "2015-07-24 11:29:00 -1"
Fri Jul 24 12:29:00 UTC 2015

(您的结果可能会因TZ设置而异)

然后day部分被解释为意味着添加一天

$ date -d "2015-07-24 11:29:00 - 1 day"
Sat Jul 25 12:29:00 EDT 2015

$ date -d "2015-07-24 11:29:00 UTC-1 + 1 day"
Sat Jul 25 12:29:00 EDT 2015

为@amdixon建议的日期字符串添加时区规范,以解决歧义并获得预期结果。

答案 1 :(得分:1)

供参考,GNU coreutils信息页面为"日期输入格式":https://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html

我没有准确的答案。我知道自由格式的日期时间解析很难。玩弄日期:

$ date -d"2015-07-24 11:29:00 - 1 day" "+%F %T"
2015-07-25 08:29:00
$ date -d"2015-07-24  - 1 day" "+%F %T"
2015-07-23 00:00:00
$ date -d"11:29:00 - 1 day" "+%F %T"
2015-07-25 08:29:00
$ date -d"2015-07-24  - 1 day 11:29:00" "+%F %T"
2015-07-23 11:29:00

因此,从日期减去一天似乎有效,但从一个时间减去一天是有问题的。