微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 日期:无效日期’2018-10-21 1天’

当我在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] 举报,一经查实,本站将立刻删除。

相关推荐