【问题标题】:Why is the date command throwing an error despite successfully computing an answer?尽管成功计算了答案,为什么 date 命令会引发错误?
【发布时间】:2019-06-24 11:12:23
【问题描述】:

对于上下文,我正在使用 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 服务器上运行它。它使用now 计算时间,就像在 MINGW 上一样,但返回了一个不同的错误:./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")

同样返回

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

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

【问题讨论】:

  • 它是否适用于任意DATE1,还是仅在DATE1 存在时才有效?
  • 可能是我的 bash 知识欠佳,但即使使用 DATE1=$(date --date="$(date --date="26Jun2019 11:35:46" "+%d%b%Y %H:%M:%S")" "+%s"),我也无法使用它。它返回 date invalid date '1561512946' 并完全错过了 DATE2: 26Jun2019 11:42:40 的添加(请注意,由于某种原因,时间是我的当地时间)。
  • 我怀疑某个地方有一个愚蠢的错误:无论我输入的日期如何,它总是给出 26Jun2019 和当地时间。
  • date: invalid date 根本不是 bash 错误。 date 不是 bash 的一部分;它是一个单独的命令,通常由您的操作系统供应商提供——因此,如果代码使用 excve() 系统调用直接调用 date,您可能会在 甚至没有调用 shell 的代码中遇到该错误.
  • (如果它接受--date=now,您可能拥有 GNU 版本的 date ——这对于基于 mingw 的发行版来说是有意义的)。

标签: bash date mingw-w64


【解决方案1】:

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

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

即使出现错误消息,您也得到看似正确的结果的原因是因为您的 DATE1 现在是,所以您的内部 date 调用会产生错误并且不返回任何内容,然后外部调用只是 --date=+2 days,从现在起 2 天后生产。

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

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 ... 有助于解决此类问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 2021-05-06
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多