日期:无效日期“ 2018-10-21 +1天”

时间:2018-06-29 18:01:13

标签: linux bash date ubuntu

在2018年10月21日之后的第二天,我问/etc/mysql/mysql.conf.d/mysqld.cnf时,我的行为很奇怪:

date

确切的错误消息是:

date --date "2018-10-20 +1 day" +"%Y-%m-%d"    # OK, 2018-10-21
date --date "2018-10-21 +1 day" +"%Y-%m-%d"    # invalid date, see below
date --date "2018-10-22 +1 day" +"%Y-%m-%d"    # OK, 2018-10-23

为什么会这样?


如果相关的话。 。

这是date: invalid date ‘2018-10-21 +1 day’ 的输出:

lsb_release -a

(我在No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty 上也得到了相同的行为)。

这是Ubuntu 16.04.4 LTS的输出:

locale

这是LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=en_US.UTF-8 的输出:

date "+%z %Z"

这是-0300 BRT 的输出:

date --version

(我在date (GNU coreutils) 8.21 上也得到了相同的行为)。

1 个答案:

答案 0 :(得分:8)

在巴西,夏令时从午夜开始。这与世界上大多数地区的更改是在凌晨2:00进行的,这恰恰是因为引起这个问题的混乱。


注意::以下内容表示计算机上当前安装的时区文件中的信息,可能是OP中的信息。但是,2017年12月,巴西政府决定将今年的夏令时推迟两周,因此过渡实际上是在2018年11月4日。希望在此之前可以更新TZ数据库。

不是所有的巴西国家每年都更改时钟两次。在至少一个州(马托格罗索州),该决定由各个市政当局做出。


因此,在圣保罗,2018年10月21日将不会有00:00:00。当时钟从2018年10月20日的23:59:59开始滴答一秒时,夏令时将开始,周日将开始从凌晨1点开始:

$ TZ=America/Sao_Paulo date -d "23:59:59 2018-10-20"
Sat Oct 20 23:59:59 -03 2018

$ TZ=America/Sao_Paulo date -d "23:59:59 2018-10-20 +1 second"
Sun Oct 21 01:00:00 -02 2018

请注意TZ偏移量的变化。

仅键入不带时间的日期时,时间默认为0:00:00。如果在指定的日期不存在该时间,则date会抱怨:

$ TZ=America/Sao_Paulo date -d "2018-10-21"
date: invalid date ‘2018-10-21’

$ TZ=America/Sao_Paulo date -d "00:00:00 2018-10-21"
date: invalid date ‘00:00:00 2018-10-21’

$ TZ=America/Sao_Paulo date -d "00:30:00 2018-10-21"
date: invalid date ‘00:30:00 2018-10-21’