日期命令的日期无效错误

日期命令的日期无效错误

我想用这个命令获取日期信息:

date --date=2019-03-22

或者

date --date=2019/03/22

但它显示了这个错误:

date: invalid date ‘2019-03-22’

或者

 date: invalid date ‘2019/03/22’

正如您所见,它与 dash 无关。slash 也发生了同样的事情。

当我使用另一个日期时

date --date=2019-03-21

它正确显示信息。

它不应该与坏破折号字符有关。因为我只是删除了最后一个2并将其替换为1,并且输出正常。

出了什么问题?

有关更多信息的一些命令的结果:

$ date --version
date (GNU coreutils) 8.28
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.
$ type -a date
date is /bin/date
$ uname -m
x86_64
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic
$ which date
/bin/date
$ apt-cache policy coreutils
coreutils:
  Installed: 8.28-1ubuntu1
  Candidate: 8.28-1ubuntu1
  Version table:
 *** 8.28-1ubuntu1 500
        500 http://us.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
        100 /var/lib/dpkg/status
$ date
Fri Mar 22 06:54:59 PDT 2019
date --date=2019-03-22 2>&1 | od -c
0000000   d   a   t   e   :       i   n   v   a   l   i   d       d   a
0000020   t   e     342 200 230   2   0   1   9   -   0   3   -   2   2
0000040 342 200 231  \n
0000044

此日期的不同时区发生了一些奇怪的事情:2019-03-22。我随机将时区更改为不同的区域。其中一些有错误,有些没有!当我选择这些时,我在特定日期遇到问题:

  • 洛杉矶(美国)
  • 上海,中国)
  • 西班牙马德里)

答案1

我几乎确信这是由于给定时区转换为夏令时造成的:实际上这意味着一个小时“消失”(因此变成“ invalid”)。

在我自己的时区中,夏令时于 3 月 10 日星期日凌晨 2 点开始,因此该时间无效:

$ cat /etc/timezone
America/Toronto
$ date --date="2019-03-10 02:00:00"
date: invalid date ‘2019-03-10 02:00:00’

而紧接之前和之后的时间是有效的:

$ date --date="2019-03-10 01:59:59"
Sun Mar 10 01:59:59 EST 2019

$ date --date="2019-03-10 03:00:00"
Sun Mar 10 03:00:00 EDT 2019

在时区转换发生在午夜时,裸日期似乎无效,因为 GNUdate假定时间为午夜:

$ TZ=Asia/Tehran date --date='2019-03-22'
date: invalid date ‘2019-03-22’

但一小时后有效:

$ TZ=Asia/Tehran date --date='2019-03-22 01:00:00'
Fri Mar 22 01:00:00 +0430 2019

也可以看看无效日期 Linux

答案2

$ date_ascii="2019-03-22"
$ printf "%s" "$date_ascii" | od -c
0000000   2   0   1   9   -   0   3   -   2   2
0000012
$ TZ=Asia/Shanghai date -d "$date_ascii"
Fri Mar 22 00:00:00 America 2019

$ date_unicode="2019‑03‑22"
$ printf "%s" "$date_unicode" | od -c
0000000   2   0   1   9 342 200 221   0   3 342 200 221   2   2
0000016
$ TZ=Asia/Shanghai date -d "$date_unicode"
date: invalid date ‘2019‑03‑22’

相关内容