
Actualmente estoy diseñando una solución para sincronizar un Reloj en un Equipo. Cada vez que se enciende el Equipo después de un apagado, su Reloj marca exactamente "01:01". Para sincronizar este Equipo, tengo un interruptor remoto NEXA y un dúo Telldus. El dúo Telldus está conectado a un servidor que es un servidor NTP con fuente GPS y PPS.
Ahora al problema: actualmente, el reloj se sincroniza simplemente apagando la energía programada a las 01:00 y luego encendiendo la energía a las 01:01, lo que hace que el reloj del equipo siempre funcione correctamente.
Pero el problema está en los días de cambio de horario de verano. Si hay un día de cambio de horario de verano que indica que el reloj debe adelantarse 1 hora entre las 02:00 y las 03:00, entonces el reloj del equipo se atrasará 1 hora en un día completo. Si hay un día de cambio de horario de verano que indica que el reloj debe retroceder 1 hora, entonces el equipo funcionará 1 hora más rápido.
Por lo tanto, en los días DST FORWARD, necesito programar el equipo para que se apague a las 00:00 y se encienda a las 00:01. Entonces el Equipo será las 01:01 cuando el Reloj sea las 00:01. Cuando el reloj es las 02:00 y se cambia a las 03:00, el equipo ya estará a las 03:00, por lo que el equipo solo tendrá un reloj incorrecto durante 2 horas.
Y en los días DST BACK, necesito programar el equipo para que se apague a las 02:00 y se encienda a las 02:01. Por lo tanto, el equipo será las 02:00 cuando el reloj sea las 03:00 y el horario de verano vuelva a las 02:00, por lo que, en este caso, el reloj del equipo solo será incorrecto durante 1 hora.
Tengo plena capacidad para escribir un script que logre esto, TENIENDO EN CUENTA QUE:
Conozco un comando que puede decirme si HOY es el día en que ocurrirá un cambio de horario de verano y en qué dirección (02:00 a 03:00, o 03:00 a 02:00) ocurrirá.
Esto significa que necesito algún comando de DST dedicado O una posibilidad de "mirar en el futuro", como "¿Cuál es el reloj cuando han transcurrido 4 horas a partir de ahora, teniendo en cuenta el horario de verano?". (Entonces podría comprobar, si la diferencia entre el reloj actual y el devuelto es de 3 horas, entonces es un día DST-BACK, 4 horas, luego es un día SIN DST y 5 horas, entonces es un día DST-FORWARD)
¿Alguien que tenga una idea de tal comando?
Respuesta1
Intentar:
$ 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
Que imprime las fechas en las que cambia el horario de verano. Cambie el Europe/London
a su zona horaria.
O, un poco más largo:
$ 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
Lo que imprime los cambios de hora también. La última columna muestra si está ingresando DST ( 1
significa ingresar DST).
Respuesta2
Si alguien ha venido aquí a través de Google buscando un comando simple de detección de horario de verano para el terminal Linux, esto es suficiente. Sin embargo, esto no es lo suficientemente complejo para la pregunta de OP.
if perl -e 'exit ((localtime)[8])' ; then
echo no DST
else
echo DST
fi
*el octavo elemento en la salida de hora local en perl es $isdsthttp://perldoc.perl.org/functions/localtime.html
Respuesta3
Simplemente le preguntaría al sistema cómo imprimiría la hora en exactamente 24 horas:
now=$(date +%H)
then=$(date -d '24 hours' +%H)
dst_change=$(( then - now ))
Precaución, no ejecute esto a la hora en punto...