Команда Linux для проверки того, является ли этот день днем ​​перехода на летнее время и в каком направлении?

Команда Linux для проверки того, является ли этот день днем ​​перехода на летнее время и в каком направлении?

В настоящее время я разрабатываю решение для синхронизации часов на оборудовании. Каждый раз, когда оборудование включается после выключения питания, его часы показывают ровно "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 ))

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

Связанный контент