1

В настоящее время я разрабатываю решение для синхронизации часов на оборудовании. Каждый раз, когда оборудование включается после отключения питания, его часы точно равны «01:01». Для синхронизации этого оборудования у меня есть дистанционный переключатель NEXA и дуэт Telldus. Дуэт Telldus подключен к серверу, который является сервером NTP с источником GPS и PPS.

Теперь о проблеме: в настоящее время часы синхронизируются, просто отключив питание, запланированное на 01:00, а затем включив питание 01:01, в результате чего часы на оборудовании всегда будут работать правильно.

Но проблема заключается в днях изменения DST. Если есть день смены летнего времени, который говорит, что часы должны быть переведены на 1 час вперед с 02:00 до 03:00, то часы на оборудовании будут отставать на 1 час в течение одного полного дня. Если есть день смены летнего времени, который говорит, что часы должны быть переведены НАЗАД на 1 час, тогда оборудование будет работать на 1 час слишком быстро.

Таким образом, в дни DST FORWARD мне нужно запланировать выключение оборудования в 00:00 и включение в 00:01. Тогда оборудование будет 01:01, когда часы 00:01. Если часы установлены на 02:00 и заменены на 03:00, оборудование будет уже в 03:00, таким образом, оборудование будет иметь неправильные часы только на 2 часа.

А в дни DST BACK мне нужно запланировать выключение оборудования в 02:00 и включение в 02:01. Таким образом, оборудование будет 02:00, когда часы 03:00, а DST вернется к 02:00, поэтому в этом случае часы оборудования будут неправильными только в течение 1 часа.


У меня есть полная возможность написать сценарий, который выполнит это, дал, что:

Я знаю команду, которая может сказать мне, если СЕГОДНЯ это день, когда произойдет изменение летнего времени, и в каком направлении (с 02:00 до 03:00 или с 03:00 до 02:00) это произойдет.

Это означает, что мне нужна либо какая-то специальная команда DST, либо возможность "смотреть в будущее", например: «Что такое часы, когда прошло 4 часа, учитывая DST?». (Тогда я мог бы проверить, если разница между текущим и возвращенным часами составляет 3 часа, то это день DST-BACK, 4 часа, затем день NO-DST и 5 часов, а затем день DST-FORWARD)

У кого-нибудь есть идея такой команды?

3 ответа3

1

Пытаться:

$ zdump -v Europe/London  -c $(date '+%Y'),$(date -d '+1 year' '+%Y') | awk -v y=$(date '+%Y') '$6==y && $15~1 {print $4, $3, $6}'
30 Mar 2014
26 Oct 2014

Который печатает даты изменения DST. Измените Europe/London на ваш часовой пояс.

Или чуть дольше:

$ zdump -v Europe/London  -c $(date '+%Y'),$(date -d '+1 year' '+%Y') | awk -v y=$(date '+%Y') '
                                     ($6==y && dst=="") {dst=$15}
                                     ($6==y && dst==$15) {ftime=$12; dst=$15;}
                                     ($6==y && dst!=$15) {print ftime, "to", $12, "on", $4, $3, $6, $15; dst=$15}'
00:59:59 to 02:00:00 on 30 Mar 2014 isdst=1
01:59:59 to 01:00:00 on 26 Oct 2014 isdst=0

Который печатает время тоже меняется. Последний столбец показывает, вводите ли вы DST (1 означает ввод DST).

0

Если кто-то пришел через Google в поисках простой команды обнаружения перехода на летнее время для терминала linux, этого достаточно. Однако это не достаточно сложно для вопроса ОП.

if perl -e 'exit ((localtime)[8])' ; then
    echo no DST
else
    echo DST
fi

* восьмым элементом в выводе localtime в perl является $ isdst http://perldoc.perl.org/functions/localtime.html

0

Я бы просто спросил систему, как она будет печатать время ровно за 24 часа:

now=$(date +%H)
then=$(date -d '24 hours' +%H)
dst_change=$(( then - now ))

Осторожно, не запускайте это в самый резкий час ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .