日期错误日期命令无效

・5 分钟阅读

问题:

我想使用以下命令获取日期信息:


date --date=2019-03-22



或者


date --date=2019/03/22



但它显示了这个错误:


date: invalid date '2019-03-22'



或者


 date: invalid date '2019/03/22'



你可以看到它与破折号无关。 斜线也会发生同样的事情。

当我使用另一个日期时


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年3月22日。我随机将时区改为不同的区域。 有些是错误的,有些不是 ! 当我选择这些时,我对特定日期有问题:

  • 洛杉矶( 美国)
  • 上海( 中国)
  • 马德里( 西班牙)
  • 德黑兰( 伊朗)

回答 1:

我几乎确定这是由于在给定时区转换夏时制时发生的: 实际上这意味着一个小时"消失"(因此变成"无效")。

在我自己的时区,DST于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



由于GNU的更改在午夜发生,所以由于 GNU date 假设午夜时间为午夜,所以裸日期将出现无效状态:


$ 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'




Tianye profile image