尽管成功计算了答案,为什么 date 命令仍会抛出错误?

Why is the date command throwing an error despite successfully computing an answer?

对于上下文,我正在使用 MINGW64 的 Windows 机器上工作。我还没有机会在机器上测试这个 运行 Linux.

我正在 bash 中使用 [date][1] 并尝试将天数添加到自 1970-01-01 00:00:00 以来以秒数表示的日期,即格式 %s.我有以下 Bash 代码:

DATE1=$(date --date=now "+%s")
echo "DATE1: ${DATE1}"
DATE2=$(date --date="$(date --date="${DATE1}" "+%s")+2 days" "+%d%b%Y %H:%M:%S")
echo "DATE2: ${DATE2}"

给出控制台输出

DATE1: 156133763
date: invalid date '1561337963'
DATE2: 26Jun2019 10:59:24

事实上,DATE2的期望值精确到秒。但是控制台仍然抛出错误。为什么会发生此错误?它与 运行 MINGW64 有关系吗?

一个更新:

我 运行 这是在我有权访问的 Debian 服务器上。它像 MINGW 一样使用 now 计算时间,但返回不同的错误:./test.sh: line 3: --date=1561342165: command not found。 运行 这与自定义日期在同一台服务器上:

DATE1=$(date --date="$(date --date="19Jun2019 11:35:46" "+%d%b%Y %H:%M:%S")" "+%s")

同样returns

DATE1: 1560908146
date: invalid date ‘1560908146’
DATE2: 26Jun2019 12:20:08

这实际上表明它根本没有添加到定义的日期,而只是添加到今天的日期(我现在是 6 月 24 日)。显然,有什么不对劲!

如果要将时间戳转换为日期,则必须使用 @:

date --date=@1561344591 '+%F %T'
2019-06-24 04:49:51

即使有错误消息,你仍然得到看似正确的结果的原因是因为你的 DATE1 现在是,所以你的内部 date 调用产生错误并且 returns 什么都没有然后外部调用只是 --date=+2 days,从现在起产生 2 天。

我认为您不能将时间戳格式的 date-time 与相关语句一起使用,即使与 @ 一起使用也不起作用。您必须首先将您的时间戳转换为人类可读的日期,但即便如此您也必须小心。你可能认为这就足够了:

date --date="$(date --date=@1561344591 "+%F %T") + 2 days" "+%F %T"
2019-06-25 04:49:51

如您所见,它仍然是错误的,那是因为 +2 被解析为时区。您可以通过在时间戳转换中明确包含时区来修复它:

date --date="$(date --date=@1561344591 "+%F %T%Z") + 2 days" "+%F %T"
2019-06-26 04:49:51

一般来说,使用bash调试set -x和日期调试date --debug ...有助于解决此类问题。