代码之家  ›  专栏  ›  技术社区  ›  Rod Elias

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

  •  4
  • Rod Elias  · 技术社区  · 8 年前

    当我问的时候我有一种奇怪的行为 date 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
    

    以下是 date "+%z %Z" 以下内容:

    -0300 BRT
    

    以下是 date --version 以下内容:

    date (GNU coreutils) 8.21
    

    (我也有同样的行为 date (GNU coreutils) 8.25 )中。

    1 回复  |  直到 8 年前
        1
  •  8
  •   rici    8 年前

    在巴西,夏天从午夜开始。这与世界上大多数地区的情况不同,那里的变化发生在凌晨2点,正是因为产生这个问题的混乱。


    注: 以下是当前安装在我的机器上的时区文件中的信息,可能是操作系统的信息。然而,2017年12月,巴西政府决定将今年的夏季时间推迟两周,因此实际过渡时间为2018年11月4日。希望TZ数据库能在那之前更新。

    不是所有的巴西利亚州每年都会改变两次时钟。在至少一个州(马托格罗索),这一决定是由各个市政府作出的。


    所以在圣保罗,2018年10月21日没有00:00:00。当时钟从2018年10月20日23:59:59开始计时超过1秒时,夏季时间开始,周日从凌晨1:00开始:

    $ 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’
    
    推荐文章