Rod*_*ias 4 linux bash ubuntu date
当我要求date2018-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
Run Code Online (Sandbox Code Playgroud)
确切的错误消息是:
date: invalid date ‘2018-10-21 +1 day’
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
如果它是相关的...
这是输出lsb_release -a:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
Run Code Online (Sandbox Code Playgroud)
(我得到了同样的行为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
Run Code Online (Sandbox Code Playgroud)
这是输出date "+%z %Z":
-0300 BRT
Run Code Online (Sandbox Code Playgroud)
这是输出date --version:
date (GNU coreutils) 8.21
Run Code Online (Sandbox Code Playgroud)
(我得到了同样的行为date (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
Run Code Online (Sandbox Code Playgroud)
注意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’
Run Code Online (Sandbox Code Playgroud)