Aconteceu de eu estar brincando com at
ontem às 2h40. (Não pergunte...) Tentei agendar eventos um minuto no futuro (como um teste), e – simplesmente não aconteceu. Os eventos estavam na fila, mas eles ficaram lá quando eram 2:41, sem que nada acontecesse. Desisti e fui para a cama.
O que estava acontecendo? Bem – acontece que hoje o horário de verão terminou na Noruega (horário de verão), então de fato 2:41 aconteceram duas vezes esta noite! E com certeza, no segundo (ou seja, 3:41 como visto do horário de verão), at
então disparou os eventos programados.
Como é que isso funciona? Por que e como o agendamento está ciente da mudança de horário e escolhe a segunda vez, em vez de apenas fazê-lo quando o tempo passa do especificado?
at
tenta analisar a data e a hora fornecidas e a executamktime()
com "Horário de verão" definido como -1 (não disponível, detecção automática).at
Código fonte:man 3 mktime
:Assim
mktime()
decide se o horário de verão está ou não em vigor; e parece preferir a data posterior de duas opções possíveis (embora não esteja claro na documentação como essa decisão é tomada).at
em seguida, converte-o para o carimbo de data/hora do UNIX (segundos desde 1º de janeiro de 1970). E uma vez que você tenha isso, não existe mais mudança de horário. Mudar o relógio para frente e para trás em uma hora apenas altera a representação humana do tempo, ou o fuso horário em que você está; ele não altera o número de segundos desde a época nem o número de segundos até que a tarefa seja executada.Em uma nota lateral, você pode usar uma expressão como
next minute
, que será executada no próximo minuto, com mudança de horário ou não.