Gestire date e ore che includono l'ora legale

Questo articolo descrive come gestire le date e le ore che includono l'ora legale (DST) e l'effetto delle modifiche dell'ora legale 2007 su determinati prodotti e tecnologie.

              Versione originale del prodotto: Windows
Numero KB originale: 932955

Riepilogo

Gli sviluppatori che scrivono applicazioni che gestiscono date e ore possono usare una o più tecnologie che eseguono la manipolazione della data e dell'ora. In particolare, alcune API del sistema operativo di base, il runtime C (CRT) e Microsoft .NET Framework possono convertire o modificare in altro modo date e ore. Questo articolo descrive alcuni dei concetti generali relativi alla gestione di date e ore.

Archiviazione e manipolazione dell'ora

I timestamp sono valori che specificano una combinazione di data e ora. Le applicazioni che devono gestire i timestamp archiviano in genere tali timestamp nell'ora UTC (Universal Coordinated Time). Il vantaggio dell'ora UTC è che l'ora UTC è universale. L'ora UTC non è soggetta a fusi orari locali o all'ora legale. Tuttavia, l'ora UTC non è intuitiva o rilevante per la maggior parte degli utenti. Anche se utc è la scelta ovvia per l'archiviazione, non è una buona scelta per la visualizzazione. Pertanto, la maggior parte delle applicazioni converte l'ora UTC nell'ora locale prima di visualizzare il timestamp per l'utente. Ad esempio, Esplora risorse applica il fuso orario e l'impostazione DST al timestamp UTC prima di visualizzare date e ore per i file in una directory NTFS (New Technology File System).

La conversione dall'ora UTC all'ora locale può essere considerata come l'applicazione di due offset. Il primo è l'offset del fuso orario e il secondo è l'offset DST. Pertanto, l'ora locale è effettivamente l'ora UTC più un offset del fuso orario, oltre a qualsiasi offset DST applicabile. L'offset del fuso orario è piuttosto semplice. Il computer è configurato per un determinato fuso orario e tale fuso orario ha un offset rispetto all'ora UTC. Determinare se deve essere applicato un offset DST è molto più complesso. Questa attività si basa su molte regole complesse e dinamiche.

Queste complesse regole DST sono state modificate di recente con DST 2007. A partire dal 2007, la Stati Uniti ha adottato nuove date di inizio e nuove date di fine per l'ora legale. Inoltre, è comune per altri paesi/aree geografiche e governi modificare regolarmente le date di inizio e di fine per l'ora legale nei fusi orari che sono sotto il loro controllo. La sezione seguente descrive gli effetti della modifica dell'ora legale 2007 sui prodotti correlati agli sviluppatori.

Per altre informazioni su DST 2007, vedere Guida e supporto per l'ora legale.

Effetti DST 2007 in Windows

In Windows Update e in Microsoft Update sono disponibili aggiornamenti che consentono a Windows di applicare correttamente le modifiche per DST 2007 e per gli anni successivi. Dopo aver applicato questi aggiornamenti, Windows calcola correttamente gli offset correnti dall'ora UTC all'ora locale quando il computer passa attraverso l'ora legale. Gli offset includono gli offset per le API di base e per le API correlate al tempo di rete.

Per altre informazioni, vedere Aggiornamento cumulativo del fuso orario di dicembre 2007 per i sistemi operativi Windows.

Effetti DST 2007 sul runtime C (CRT)

Il CRT esegue anche traduzioni di data e ora. Di conseguenza, è necessario aggiornare anche CRT per includere le nuove regole per DST 2007. Il CRT esegue la gestione dell'ora solo quando viene impostata la variabile di ambiente TZ o quando una chiamata all'ora dell'API del sistema operativo sottostante non riesce. Aggiornamenti sono disponibili per i CRL inclusi in ogni versione di Visual Studio e anche per i CRL inclusi in Windows. Questi aggiornamenti consentono a CRT di continuare a gestire correttamente le conversioni DST in Stati Uniti fusi orari.

Effetti di DST 2007 su .NET Framework

.NET Framework si basa sulle chiamate del sistema operativo sottostante. Pertanto, il comportamento di .NET Framework riflette lo stato del sistema operativo sottostante. Non è necessario alcun aggiornamento separato.

Effetti DST 2007 sugli IDE di Visual Studio .NET

Gli ambienti di sviluppo integrato (IDE) di Visual Studio .NET includono le versioni 2002, 2003 e 2005 di Visual C++, Visual C# e Visual Basic. Questi prodotti sono interessati solo perché includono il CRT. Non è necessario alcun aggiornamento specifico dell'IDE.

Effetti di DST 2007 su Visual Studio 2005 Team Foundation Server

Visual Studio 2005 Team Foundation Server si basa sul sistema operativo sottostante per le conversioni di data e ora. Di conseguenza, Visual Studio 2005 Team Foundation Server presenta lo stesso comportamento del sistema operativo. Visual Studio 2005 Team Foundation Server si basa anche su SQL Server, SQL Server Reporting Services e Windows SharePoint Services. I computer devono essere aggiornati con gli aggiornamenti pertinenti per il sistema operativo, per SQL Server e per Windows SharePoint Services. Tutti gli aggiornamenti pertinenti devono essere applicati contemporaneamente a tutti i computer interessati. Non è necessario alcun aggiornamento separato di Visual Studio 2005 Team Foundation Server.

Effetti di DST 2007 su Visual Studio 2005 Team System

Visual Studio 2005 Team System è interessato dal sistema operativo, da Visual Studio 2005 Team Foundation Server e da CRT. Non è necessario alcun aggiornamento separato di Visual Studio 2005 Team System.

Effetti di DST 2007 sul runtime di Visual Basic 6.0

Il runtime di Visual Basic 6.0 non è interessato.

Effetti di DST 2007 su Visual C++ 6.0

Visual C++ 6.0 non è più supportato. Per maggiori informazioni, vedere Criteri relativi al ciclo di vita di Microsoft.

Effetti DST 2007 su Windows SDK per Windows Vista

Questo Software Development Kit (SDK) include una versione di CRT interessata dalle modifiche di DST 2007. Come parte dell'installazione di questo SDK, è possibile installare Visual Studio 2005 CRT nei computer in cui non è già installata tale versione di CRT. Se è già installata una versione più recente di CRT, l'installazione dell'SDK non sovrascrive quella versione più recente. Quando l'SDK viene disinstallato, la versione più recente di CRT viene lasciata nel computer. È possibile installare l'aggiornamento CRT di Visual Studio 2005 prima o dopo l'installazione dell'SDK.

Windows SDK per Windows Vista installa anche un set di moduli unione (file con estensione msm) per Visual Studio 2005 CRT per la ridistribuzione del CRT come parte delle applicazioni C++ personalizzate. Un'applicazione che distribuisce il CRT ridistribuibile nella cartella di installazione dell'applicazione deve distribuire il CRT aggiornato dall'aggiornamento CRT di Visual Studio 2005 anziché i file con estensione msm CRT da Windows SDK per Windows Vista. Un'applicazione che distribuisce l'aggiornamento CRT ridistribuibile di Visual Studio 2005 nella cartella di installazione di Windows deve applicare l'aggiornamento ridistribuibile di Visual Studio 2005 CRT a tali computer.

Effetti di DST 2007 su Platform SDK per Windows Server 2003 R2

Questo SDK include una versione di CRT interessata dalle modifiche di DST 2007. I clienti devono seguire le note sulla versione per questo SDK e usare gli aggiornamenti CRT di Visual Studio 2005, se necessario.

Effetti di DST 2007 su .NET Framework 2.0 SDK

Questo SDK include una versione di CRT interessata dalle modifiche di DST 2007. Come parte dell'installazione di questo SDK, è possibile installare Visual Studio 2005 CRT nei computer in cui non è già installata tale versione di CRT. Se è già installata una versione più recente di CRT, l'installazione dell'SDK non sovrascrive quella versione più recente. Quando l'SDK viene disinstallato, la versione più recente di CRT viene lasciata nel computer. È possibile installare l'aggiornamento CRT di Visual Studio 2005 prima o dopo l'installazione dell'SDK.

Conversione dell'ora locale in Windows

Le applicazioni in genere convertono le ore UTC in ore locali prima di visualizzare le informazioni sull'ora e la data all'utente. Windows offre diverse API per le applicazioni da usare per la manipolazione del timestamp.

  • La GetSystemTime() funzione e la GetSystemTimeAsFileTime() funzione ottengono l'ora UTC corrente in una SYSTEMTIME struttura o in una FILETIME struttura.

  • La GetLocalTime() funzione ottiene l'ora locale corrente in una SYSTEMTIME struttura.

  • La GetTimeZoneInformation() funzione ottiene una TIME_ZONE_INFORMATION struttura che descrive il fuso orario corrente e l'impostazione dell'ora legale per il computer.

  • Funzione SystemTimeToFileTime() e marshalling della FileTimeToSystemTime() funzione tra SYSTEMTIME strutture e FILETIME strutture.

  • La FileTimeToLocalFileTime() funzione e la LocalFileTimeToFileTime() funzione convertono e traducono una FILETIME struttura tra l'ora UTC e l'ora locale usando il fuso orario corrente e l'impostazione DST nel computer.

  • La SystemTimeToTzSpecificLocalTime() funzione e la TzSpecificTimeToSystemTime() funzione convertono un timestamp UTC in una SYSTEMTIME struttura in una struttura locale SYSTEMTIME . Queste funzioni usano una TIME_ZONE_INFORMATION struttura che specifica la data di inizio e la data di fine per l'ora legale. Per impostazione predefinita, le regole DST correnti vengono usate quando non viene fornita alcuna struttura di questo tipo.

  • La NetRemoteTOD() funzione ottiene l'ora da un server remoto usando le informazioni e le impostazioni del server.

Nota

La FileTimeToLocalFileTime() funzione e la LocalFileTimeToFileTime() funzione eseguono la conversione tra l'ora UTC e l'ora locale usando solo le informazioni correnti sul fuso orario e le informazioni sull'ora legale. Questa conversione si verifica indipendentemente dal timestamp che viene convertito.

Per visualizzare un esempio di questo comportamento in Esplora risorse, seguire questa procedura in un computer che si trova in un fuso orario che usa l'ora legale.

Per questi passaggi è necessario modificare l'orologio di sistema. È pertanto necessario uscire da tutte le applicazioni, ad esempio le applicazioni di calendario, che potrebbero reagire a queste modifiche temporali prima di seguire questi passaggi.

  1. Modificare la data nel computer in un giorno DST. Ad esempio, impostare la data su 1 luglio 2006.
  2. In una directory NTFS nello stesso computer creare un nuovo file di testo denominato Test.txt.
  3. Si noti che il timestamp nel file viene visualizzato come indicato di seguito in Esplora risorse:
    1/7/2006 15:37
  4. Modificare la data nel computer in un giorno non DST. Ad esempio, impostare la data su 1 febbraio 2007.
  5. Aggiornare la finestra di Esplora risorse.
  6. Si noti che il timestamp nel file viene visualizzato come indicato di seguito in Esplora risorse:
    1/7/2006 14:37

In questo esempio precedente, il timestamp UTC nel file non cambia. Tuttavia, le regole usate per convertire il timestamp in una modifica dell'ora locale a seconda della data corrente nel computer. Nel passaggio 3 è stato applicato un offset DST perché il 1° luglio rientra nell'intervallo DST. Nel passaggio 6 non è stato applicato alcun offset DST, perché il 1 febbraio non rientra nell'intervallo dell'ora legale. Questo comportamento si verifica in modo che il timestamp del file possa essere convertito in modo deterministico nell'ora locale e dall'ora locale.

Il SystemTimeToTzSpecificLocalTime() metodo e il metodo si convertono tra l'ora TzSpecificTimeToSystemTime() UTC e l'ora locale usando la struttura fornita TIME_ZONE_INFORMATION . Se non vengono fornite informazioni sul fuso orario, queste funzioni usano le regole correnti del fuso orario e le regole dell'ora legale per determinare se è necessario applicare un offset DST al timestamp. Si tratta di un'operazione funzionale equivalente alla chiamata al GetTimeZoneInformation() metodo per ottenere la TIME_ZONE_INFORMATION struttura attualmente in vigore.

La TIME_ZONE_INFORMATION struttura include la data di inizio e la data di arresto per l'ora legale. Pertanto, quando la TIME_ZONE_INFORMATION struttura usa le informazioni sul fuso orario corrente, la TIME_ZONE_INFORMATION struttura può introdurre un'imprecisione cronologica. Questo comportamento può verificarsi se le informazioni correnti sul fuso orario e le informazioni sull'ora legale non riflettono il timestamp che viene convertito. Questo comportamento è influenzato da DST 2007 solo perché sono state modificate le regole che regolano le date di avvio e arresto dell'ora legale.

Per ottenere conversioni storicamente accurate da queste funzioni, un'applicazione deve fornire una struttura storicamente accurata TIME_ZONE_INFORMATION quando l'applicazione chiama queste funzioni.

Fusi orari dinamici in Windows

Windows Vista introduce fusi orari DST dinamici. L'ora legale dinamica fornisce supporto per i fusi orari i cui limiti per l'ora legale cambiano di anno in anno. Queste regole vengono archiviate nel Registro di sistema. Le applicazioni possono eseguire query sulle regole usando la GetDynamicTimeZoneInformation() funzione .

I fusi orari dinamici consentono un aggiornamento più semplice dei computer, in particolare per le impostazioni locali in cui i limiti dell'ora legale annuale sono noti in anticipo. Per altre informazioni sulla DYNAMIC_TIME_ZONE_INFORMATION struttura in Windows SDK per Vista, vedere DYNAMIC_TIME_ZONE_INFORMATION struttura.

Conversione dell'ora locale nel runtime C (CRT)

Il CRT ha fondamentalmente tre modalità in cui può tradurre timestamp:

  • Se la variabile di ambiente TZ non è impostata, il CRT chiama le API di Windows e mostra il comportamento di Windows come descritto in questo articolo.

  • Se la variabile di ambiente TZ è impostata, CRT esegue le proprie conversioni basate su tale impostazione. Il CRT viene aggiornato in modo che rispetti le nuove regole DST 2007 quando esegue conversioni in questo scenario.

  • Se la variabile di ambiente TZ non è impostata, ma le API di Windows sottostanti hanno esito negativo, il CRT restituisce le proprie conversioni usando un valore di PST8PDT per la variabile di ambiente TZ.

CRT contiene la propria logica per la conversione dell'ora UTC nell'ora locale. Le applicazioni possono ottenere timestamp UTC da funzioni come la time() funzione . Questi timestamp UTC vengono archiviati in time_t valori. La conversione all'ora locale può essere eseguita con una funzione come la localtime_s() funzione . La localtime_s() funzione popola una tm struttura definita nel file di intestazione Time.h . La tm struttura è basata sul fuso orario definito nella variabile di ambiente TZ e sulle regole DST in vigore al momento del timestamp.

Nota

Questa conversione segue regole specifiche del Stati Uniti.

Prima di applicare l'aggiornamento DST 2007, CRT gestisce correttamente i timestamp correnti in Stati Uniti fusi orari. Dopo aver applicato l'aggiornamento DST 2007, CRT gestisce anche le date di Stati Uniti precedenti e future. Aggiornamenti per CRT sono elencate nella sezione Riferimenti.

Conversione dell'ora locale in .NET Framework

.NET Framework contiene classi che archivia e convertono timestamp. Queste classi includono la DateTime classe , la TimeZone classe , la TimeSpan classe e la DateTimeKind classe . Come indicato in precedenza, queste classi dipendono principalmente dall'implementazione della piattaforma sottostante. Queste classi presentano lo stesso comportamento delle API del sistema operativo sottostanti.

Un comportamento interessante mostrato dalle classi di data e ora di .NET Framework è correlato alle funzioni che compensano il timestamp di una quantità richiesta. Si considerino, ad esempio, la AddHours() funzione, la AddMinutes() funzione e la AddSeconds() funzione nella DateTime classe . Queste funzioni, e funzioni denominate in modo analogo, incrementano semplicemente il timestamp in base alla quantità richiesta senza considerare le impostazioni dell'ora legale. Questo comportamento può essere considerato aritmetico semplice nel timestamp UTC sottostante. Tuttavia, questo comportamento potrebbe causare risultati imprevisti quando l'addizione fa sì che il timestamp passi all'interno o all'esterno dell'ora legale. Questo comportamento non è correlato alle modifiche di DST 2007.

Suggerimenti

Le raccomandazioni seguenti consentono agli sviluppatori di ridurre al minimo l'effetto di DST 2007 e migliorare la gestione generale di data e ora.

  • È consigliabile pianificare un'installazione quasi atomica degli aggiornamenti di DST 2007. Tutti gli aggiornamenti pianificati di DST 2007 devono essere applicati il più possibile in tempo. Se un computer che è stato aggiornato tenta di usare metodi come query SQL o servizi Web per comunicare con un computer che non è stato aggiornato, potrebbero verificarsi errori di traduzione. Analogamente, se un singolo computer richiede due o più aggiornamenti, ad esempio Windows Update e L'aggiornamento CRT, gli aggiornamenti devono essere applicati contemporaneamente.

  • I timestamp UTC sono storicamente accurati. È in genere la conversione all'ora locale che riguarda la maggior parte delle applicazioni. Le applicazioni devono sempre archiviare i timestamp UTC. Le conversioni all'ora locale a scopo di visualizzazione richiedono informazioni sul fuso orario e informazioni sull'ora legale. Queste informazioni possono provenire da diverse origini:

    • L'applicazione può usare il fuso orario corrente e l'impostazione dell'ora legale per la conversione. Ciò può introdurre un'imprecisione nella conversione se il fuso orario corrente e l'impostazione dell'ora legale non erano in vigore al momento del timestamp.

    • L'applicazione può archiviare le informazioni sul fuso orario e le informazioni sull'ora legale in precedenza accurate oltre al timestamp UTC.

    • Quando sono disponibili fusi orari dinamici, l'applicazione può usare fusi orari dinamici per determinare quali informazioni sul fuso orario devono essere applicate a un timestamp UTC specifico. Questa opzione è disponibile solo quando le informazioni sul fuso orario dinamico sono disponibili per un timestamp specifico e per un fuso orario specifico.

    • L'applicazione può archiviare un timestamp locale e il timestamp UTC. Questo metodo impedisce la necessità di una conversione futura.

  • Qualsiasi comunicazione tra computer che gestiscono timestamp deve usare timestamp UTC. In questo modo, entrambi i computer vengono implicitamente assegnati alle stesse informazioni di contesto per l'ora UTC.

  • Se un'applicazione gestisce le date, è necessario prestare attenzione al modo in cui le date vengono gestite nel test. Le date visualizzate senza informazioni sull'ora vengono in genere archiviate come timestamp delle 12:00 della data pertinente. Pertanto, un errore off-by-one nella parte oraria del timestamp potrebbe causare un risultato off-by-one nella data di validità se l'ora viene spostata alle 23:00 del giorno precedente.

Riferimenti