在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
上也得到了相同的行为)。
答案 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’