дата: недействительная дата ‘2018-10-21 +1 день’ - PullRequest
0 голосов
/ 29 июня 2018

Я получаю странное поведение, когда спрашиваю 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 Ответ

0 голосов
/ 30 июня 2018

В Бразилии летнее время начинается в полночь. Это отличается от большинства частей мира, где изменение происходит в 2:00 утра, именно из-за путаницы, которая вызывает этот вопрос.


ПРИМЕЧАНИЕ: Ниже представлена ​​информация в файле часового пояса, установленном в настоящее время на моем компьютере, и предположительно информация об OP. Тем не менее, в декабре 2017 года правительство Бразилии решило отложить летнее время на две недели в этом году, поэтому переход фактически будет 4 ноября 2018 года. Надеемся, что база данных TZ будет обновлена ​​до этого.

Не все бразильские штаты меняют свои часы дважды в год. По крайней мере, в одном штате (Матто Гросу) решение принимается отдельными муниципалитетами.


Таким образом, в Сан-Паулу 21 октября 2018 года не будет 00:00:00. Когда часы отсчитывают секунду с 23:59:59 20 октября 2018 года, наступит летнее время, а в воскресенье начало в 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’
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...