Сообщение об ошибке «дата: недействительная дата« 2016-10-16 »»

35

Сегодня мои часы были автоматически переведены на летнее время, и скрипт из crontab начал давать сбои. Я посмотрел на то, что происходило, и отображалась следующая ошибка LC_ALL=C:

дата: недействительная дата '2016-10-16'

Я, хотя было бы лучше просто перезагрузить систему, но теперь я перезагрузил, и ошибка все еще появляется:

$ date -d '2016-10-15'
Sat Oct 15 00:00:00 BRT 2016
$ date -d '2016-10-16'
date: data inválida “2016-10-16”
$ date -d '2016-10-17'
Mon Oct 17 00:00:00 BRST 2016

Что может быть причиной этого?

Тереза ​​и Джуниор
источник
С какой ОС вы запускаете эту команду? Невозможно воспроизвести на Debian 8. Пробовал с двумя разными locales: sv_SE.utf8и en_us.utf-8.
Maulinglawns
2
В какое время дня (ночи) Бразилия переводит часы на летнее время?
Techraf
Я думаю, что все страны, где происходит смена в последнее время, например, 2 часа ночи, где это менее вероятно, вызовет проблемы.
njzk2

Ответы:

57

Проблема в том, что летнее время изменилось и перешло 1 час 16 октября 2016 года в вашем часовом поясе:

$ zdump -v America/Sao_Paulo | awk '/Oct 16/ && /2016/'
America/Sao_Paulo  Sun Oct 16 02:59:59 2016 UTC = Sat Oct 15 23:59:59 2016 BRT isdst=0
America/Sao_Paulo  Sun Oct 16 03:00:00 2016 UTC = Sun Oct 16 01:00:00 2016 BRST isdst=1

Таким образом, любое время между 00:00в 00:59этот день считается недействительным в вашем часовом поясе (но может быть допустимым в других):

$ TZ=America/Sao_Paulo gdate -d '2016-10-16 0:59'
gdate: invalid date ‘2016-10-16 0:59’

$ TZ=Asia/Ho_Chi_Minh gdate -d '2016-10-16 0:59'
Sun Oct 16 00:59:00 ICT 2016

Вы можете установить дополнительное время, которое не находится в этом диапазоне:

$ TZ=America/Sao_Paulo gdate -d '2016-10-16 1:00'
Sun Oct 16 01:00:00 BRST 2016

Выше приведено поведение даты GNU.

Дата BSD не имеет этой проблемы. Если введенная дата недействительна в часовом поясе, она будет бесшумно скорректирована на 1 час до достижения действительного времени:

$ TZ=America/Sao_Paulo date -j -f '%Y%m%d%H%M' 201610160000
Sun Oct 16 01:00:53 BRST 2016
cuonglm
источник
1 час 53 секунды ?!
Домен
Таким образом, он скорректировал время на 53 секунды слишком далеко в будущем? Или я что-то не так понял?
Домен
1
Ааа, имеет смысл; сохраняет не указанные данные (в отличие от очистки). Все еще немного странно, так как в этом случае было бы достаточно корректировки вперед к 00:59:07.
Домен