Lavori pianificati durante le ore del cambio di orario autunnale


12

Mi chiedo come le altre persone affrontano questo scenario.

Che cosa succede se si pianifica l'esecuzione di un lavoro all'01: 30. In autunno, quando il tempo cambia, l'ora dalle 1:00:00 alle 1:59:59 si ripete e il lavoro verrebbe eseguito due volte.

Potrebbe essere l'Utilità di pianificazione di Windows, l'agente SQL o qualsiasi altro strumento di pianificazione. La maggior parte di questi strumenti sembra essere basata sul tempo della macchina, non sul tempo UTC. Se gli dicessi di eseguire il lavoro all'ora UTC ogni notte, non avrei il problema dell'ora duplicata.


1
Non sono riuscito a trovare nulla di più attuale, ma spero che questo faccia luce sul problema per te - support.microsoft.com/kb/325413
joeqwerty

È eccellente, perché non pubblicare una risposta?
NealWalters,

Beh, non ti dà davvero una soluzione (almeno non che io possa discernere dalla sua lettura) ma ho pensato che sarebbe stato utile per capire il problema. Sono felice di lasciarlo come commento.
joeqwerty,

Risposte:


10

La corretta pianificazione delle attività future in base all'ora locale, tenendo conto dei fusi orari e dell'ora legale, è un argomento molto complesso. Ne ho già parlato da una prospettiva di programmazione su Stack Overflow qui e qui .

Riassumo in una prospettiva non programmativa:

  • Definisci i tuoi schemi di ricorrenza in base all'ora locale , non all'ora UTC . Ad esempio, se imposti una sveglia giornaliera per svegliarti alle 8:00 tutti i giorni, non vuoi svegliarti un'ora prima o un'ora dopo una transizione di ora legale. Se mi trovo nel fuso orario degli Stati Uniti del Pacifico, non posso programmare per le 4:00 PM UTC, perché dopo la transizione dovrebbe passare alle 3:00 PM UTC per mantenere la stessa ora locale 8:00 AM.

  • Definire il fuso orario rappresentato dall'ora "locale". Non dare per scontato che il fuso orario locale del server sia lo stesso fuso orario che conta per l'utente finale.

  • Proiettare l'ora locale su una data e ora UTC per ogni ricorrenza che si desidera attivare l'evento.

    • Lo farai quasi sempre per la prossima occorrenza immediata, in modo tale da poter utilizzare l'orologio UTC per determinare l'istante reale in tempo per l'esecuzione.

    • In alcuni casi, potresti voler proiettare anche le successive (o molte) istanze successive, come le successive 5 occorrenze o tutte le occorrenze per l'anno successivo. (Questa parte è altamente specifica per i requisiti dell'applicazione.)

  • Predisporre una strategia (fissa o configurabile), che cosa fare per gli eventi che cadono al momento di una transizione dell'ora legale :

    • Per la transizione "molla in avanti", c'è un gap di ora locale mancante quando l'evento potrebbe non esistere. Ad esempio, nell'ora del Pacifico degli Stati Uniti, un'attività giornaliera pianificata per l'esecuzione alle 2:00 ora locale non esisterà il 9 marzo 2014. Nella maggior parte dei casi, ti consigliamo di anticipare tale importo in base all'importo del risparmio (di solito 1 ora ), quindi quel giorno verrà eseguito alle 3:00, ma tornerà in esecuzione alle 2:00 nella prossima istanza. (Tuttavia, è del tutto possibile che tu voglia una strategia diversa per questo.)

    • Per la transizione "fallback", c'è una sovrapposizione di ora locale duplicata quando l'evento potrebbe esistere due volte . Ad esempio, in US Pacific Time, un'attività giornaliera pianificata per essere eseguita all'1: 00 avrà due possibili volte che potrebbe essere eseguita il 2 novembre 2014. Nella maggior parte dei casi, ti consigliamo di eseguire alla prima occorrenza di 1 : 00 AM PDT e salta la prossima occorrenza di 1:00 AM PST della stessa data. (Ma ancora una volta, potresti volere una strategia diversa, come l'esecuzione alla seconda occorrenza o l'esecuzione in entrambe. YMMV)

  • Preparati a ricalcolare tutti i tuoi orari UTC di occorrenza se dovessi mai aggiornare i dati del fuso orario. I IANA / Olson TZDB mette fuori più aggiornamenti ogni anno perché i governi del mondo cambiano le loro menti tutto il tempo sulle loro offset di fuso orario e le regole di ora legale. Non puoi assumere per un periodo di tempo specifico in futuro che le regole non cambieranno .

    • Assicurati di iscriverti per gli annunci dei rilasci di dati di fuso orario e di avere una procedura per applicarli ai tuoi sistemi e / o applicazioni.

    • In un ambiente aziendale tradizionale, questa dovrebbe essere la responsabilità del personale delle operazioni IT.

    • A seconda del proprio ambiente, è possibile che si ottengano questi dati tramite gli tzdataaggiornamenti del pacchetto Linux, tramite Java JRE o tzupdater o un numero qualsiasi di altri canali. A volte è specifico per l'ambiente, a volte è specifico per la piattaforma di programmazione, come il pacchetto PECL timezonedb per PHP e molti altri.

    • Microsoft ha i propri dati sul fuso orario. Su Windows, se stai utilizzando TimeZoneInfo.NET (ad esempio), stai utilizzando questi dati. Gli aggiornamenti provengono da qui e vengono anche inviati automaticamente tramite Windows Update, quindi dovresti tenere d'occhio quelli in modo da sapere quando / se devi ricalcolare.

  • Con tutto che ha capito, non v'è ancora uno scenario in cui si desidera programmare solo con UTC, e che è per ASSOLUTI eventi futuri. Esempi:

    • Un lavoro che viene eseguito ogni X ore o ogni X minuti.

    • Orari di inizio e fine dell'alba o altri fenomeni astronomici.

    • Una finestra di sicurezza sensibile al tempo, ad esempio quando si trasmettono informazioni sensibili a un'altra parte in un momento prestabilito.


Utilità di pianificazione di Windows

Windows non sta necessariamente facendo la cosa giusta. Presta attenzione a come definisci il trigger:

Utilità di pianificazione di Windows

Quando si seleziona la casella "Sincronizza tra fusi orari", l'attività viene pianificata solo da UTC. (Tutti gli orari sono ancora visualizzati come ora locale, ma sono memorizzati come UTC.) Quindi questo è per quello che in precedenza ho chiamato un evento "assoluto".

Quando la casella viene lasciata deselezionata, verrà utilizzato il fuso orario locale del computer su cui è in esecuzione il codice. Non ti dà alcuna opzione per specificare il fuso orario, quindi non è un'ottima IMHO di implementazione.

Non sono esattamente sicuro del comportamento dell'ora legale, ma sperimenterò e ti ricontatterò. Probabilmente fa ciò che ho descritto sopra, ma non necessariamente.


Agente SQL

La pianificazione di SQL Agent è ancora peggio, nel senso che solo consente di utilizzare ora locale del server. Ancora una volta, non è possibile specificare fusi orari e non è nemmeno possibile specificare UTC.

È stato richiesto , ma non accettato.


Quindi, in sostanza, con gli strumenti specifici SQL Agent e Utilità di pianificazione di Windows, hai delle modifiche manuali da apportare ogni volta, giusto? O potenzialmente, il codice eseguito dallo scheduler potrebbe ricontrollare l'ora UTC, quindi eventualmente fare un ritardo (in autunno), ma nessun modo per evitare che il lavoro non venga eseguito in primavera se non una modifica manuale. O forse una sceneggiatura per riprogrammare effettivamente il programma?
NealWalters,

Ho aggiornato la risposta con informazioni su Utilità di pianificazione di Windows e Agente SQL. Né lo fanno completamente bene. Se vuoi sviluppare la tua soluzione, potresti dare un'occhiata a Quartz.net .
Matt Johnson-Pint,

A breve termine, è possibile utilizzare l'Utilità di pianificazione di Windows con la casella selezionata per definire le attività da eseguire in orari UTC specifici. Ma probabilmente vorrai che quelle siano attività una tantum che costruisci a livello di codice dal tuo codice in modo da poter prendere in considerazione il resto.
Matt Johnson-Pint,

Un'altra grande risposta!
NealWalters,

1

Non preoccupandoti, in generale.

Poni la domanda "quindi cosa succede se l'attività viene eseguita due volte?"

In generale, non importa, quindi non devi fare nulla. Se è importante, la soluzione più semplice è spostare il lavoro fuori dall'ora influenzato dal cambio dell'ora legale.


Se non mi fosse importato, non avrei chiesto. Alcuni contano, altri no. Alle 2:00 abbiamo lavori che estraggono il file e lo inviano ai nostri fornitori. Non credo che le 2:00 si ripeteranno. Passeremo alle 2:05 solo per un'assicurazione aggiuntiva. Abbiamo backup, processi di indicizzazione intelligente, ecc ... ma fortunatamente sono più tardi.
NealWalters,

1
@NealWalters Penso che sia un punto giusto, essere onesti con hopelessnoob: se non importa se un'attività viene eseguita due volte, allora perché preoccuparsi. Non ti conosco ma ho molte cose di cui preoccuparsi, invece di cui preoccuparsi senza preoccuparsi delle cose di cui non devo preoccuparmi. Se non importa allora si dovrebbe già codifica a fare qualche controllo sanità mentale in ogni caso . Detto questo, è sicuramente una buona idea evitare di programmare le cose per l'esecuzione nel punto esatto in cui gli orologi tornano indietro - questo è solo chiedere problemi.
Rob Moir,

Non è una mia scelta, inviamo file di estrazione agli aeroporti a quell'ora del mattino, ed è l'ora che vogliono il file. Stiamo usando BizTalk, un sistema basato su messaggi, quindi è più difficile controllare due volte cose come questa. È un po 'deludente che l'utilità di pianificazione SQL e l'utilità di pianificazione di Windows non consentano un orario UTC giornaliero.
NealWalters,

1

Come hai notato, l'ora tra l'1 e le 2 del mattino si ripete alla fine dell'ora legale; quando si verifica la modifica inversa (l'inizio dell'ora legale) i tempi tra 2AM e 3AM non si verificano (e il lavoro non verrà eseguito). Le tue migliori opzioni saranno

  • eseguire la pianificazione del lavoro su UTC
  • eseguire il lavoro in un momento esterno al passaggio all'euro (00:59 o 03:00)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.