当我在2018-10-21之后询问日期时,我会遇到一种奇怪的行为:
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
这是日期“%z%Z”的输出:
-0300 BRT
这是日期的输出–version:
date (GNU coreutils) 8.21
(我在日期得到了相同的行为(GNU coreutils)8.25).
解决方法:
在巴西,夏令时从午夜开始.这与世界上大多数地方不同,那里的变化发生在凌晨2点,正是由于引起这个问题的混乱.
注意:以下代表当前安装在我的机器上的时区文件中的信息,可能是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.如果某一天不存在该时间,则日期会抱怨:
$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’
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。