Bash Дата пробуждения - PullRequest
       4

Bash Дата пробуждения

2 голосов
/ 29 марта 2020

Уже несколько месяцев я использовал эту команду в сценарии на моем NAS:

sudo rtcwake -m disk -t  "$(date -d 'tomorrow  02:00:00' '+%s')"

Сегодня я получил ошибку.

Результаты моего теста:

root@omvnas:~# date -d 'tomorrow  02:00:00' '+%s'
date: ungültiges Datum „tomorrow  02:00:00“
root@omvnas:~# date -d '+1 day 3:00'
Mo 30. Mär 03:00:00 CEST 2020
root@omvnas:~# date -d '+1 day 2:00'
date: ungültiges Datum „+1 day 2:00“
root@omvnas:~# date -d '+1 day 1:00'
Mo 30. Mär 01:00:00 CEST 2020

"ungültiges Datum" в переводе с немецкого означает "недействительная дата".

Почему это происходит?

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Кажется, что это ошибка в date / tzdata, связанная с переходом на летнее время (DST) .

Вот соответствующий отчет об ошибке: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=819342

Воспроизводится с текущим Sid Debian.

На данный момент лучше всего использовать время, которое не зависит от летнего времени (например, 03:00 : 00)

.
2 голосов
/ 29 марта 2020

Эта проблема действительно связана с переходом на летнее время , но это не ошибка программы date, а скорее «особенность»: все приведенные ниже команды вызывают ошибку, поскольку указанное время не существует в местном часовом поясе (который напрямую переходит от 01:59:59 к 03:00:00).

$ date -d '02:00:00'
date: invalid date ‘02:00:00’
$ date -d '02:30:00'
date: invalid date ‘02:30:00’
$ date -d '+1 day 02:30:00'
date: invalid date ‘+1 day 02:30:00’
$ date -d '+2 day 02:30:00'
date: invalid date ‘+2 day 02:30:00’

, а две последние команды выше, безусловно, вызывают ошибку, поскольку программа date попытки увеличить количество дней после разрешения указанного времени, которое действительно недопустимо.

Как я уже упоминал в своем комментарии, надежным способом обойти эту проблему могло бы стать использование UTC часовой пояс (опция --utc):

$ date -d 'today 01:59:59' -R
Sun, 29 Mar 2020 01:59:59 +0100
$ date -d 'today 01:59:59' '+%s'
1585443599
$ date -d 'today 02:00:00' '+%s'
date: invalid date ‘today 02:00:00’
$ date -d 'today 03:00:00' '+%s'
1585443600
$ date -u -d 'today 01:00:00' '+%s'  # OK thanks to option -u
1585443600
...