
В настоящее время я разрабатываю решение для синхронизации часов на оборудовании. Каждый раз, когда оборудование включается после выключения питания, его часы показывают ровно "01:01". Для синхронизации этого оборудования у меня есть дистанционный переключатель NEXA и Telldus duo. Telldus duo подключен к серверу, который является сервером NTP с источником GPS и PPS.
Теперь о проблеме: в настоящее время часы синхронизируются путем простого отключения питания в 01:00 и последующего включения питания в 01:01, в результате чего часы на оборудовании всегда идут правильно.
Но проблема в днях перехода на летнее время. Если есть день перехода на летнее время, который говорит, что часы должны быть переведены ВПЕРЕД на 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 часов.
А в дни ПЕРЕХОДА НА ЛЕТНЕЕ ВРЕМЯ мне нужно запланировать выключение Оборудования в 02:00 и включение в 02:01. Таким образом, Оборудование будет в 02:00, когда Часы в 03:00 и будут переведены на летнее время в 02:00, таким образом, в этом случае Часы Оборудования будут неверными только в течение 1 часа.
У меня есть все возможности написать сценарий, который это выполнит, УЧИТЫВАЯ ЧТО:
Я знаю команду, которая может сообщить мне, произойдет ли СЕГОДНЯ переход на летнее время и в каком направлении (с 02:00 на 03:00 или с 03:00 на 02:00).
Это значит, что мне нужна либо специальная команда DST, ЛИБО возможность «заглянуть в будущее», например, «Сколько будет часов через 4 часа с учетом летнего времени?». (Тогда я мог бы проверить, если разница между текущим временем и возвращенным временем составляет 3 часа, то это день DST-BACK, 4 часа — день NO-DST, а 5 часов — день DST-FORWARD)
У кого-нибудь есть идея такой команды?
решение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
Который печатает даты перехода на летнее время. Измените 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
Который печатает изменения времени тоже. Последний столбец показывает, входите ли вы в летнее время ( 1
означает вхождение в летнее время).
решение2
Если кто-то пришел сюда через Google в поисках простой команды определения летнего времени для терминала Linux, этого достаточно. Однако это недостаточно сложно для вопроса OP.
if perl -e 'exit ((localtime)[8])' ; then
echo no DST
else
echo DST
fi
*8-й элемент в выводе localtime в Perl — $isdsthttp://perldoc.perl.org/functions/localtime.html
решение3
Я бы просто спросил систему, как она будет выводить время ровно через 24 часа:
now=$(date +%H)
then=$(date -d '24 hours' +%H)
dst_change=$(( then - now ))
Осторожно, не запускайте это ровно в час...