GMT è l’acronimo di Greenwich Meridian Time, che è un orario di riferimento per il mondo; è l’ora di Greenwich, in Inghilterra, e talvolta viene chiamata “ora Zulu”. (Zulu è il nome fonetico di zero e lo zero si riferisce alla longitudine di Greenwich, in Inghilterra.)

Potrebbe essere necessario convertire l’ora locale in GMT nel foglio di lavoro. Se sai sempre che l’ora verrà inserita nell’ora locale, questo può essere fatto abbastanza facilmente con una formula. Ad esempio, supponi di inserire l’ora locale nella cella B7 e di trovarti nel fuso orario del Pacifico. In questo fuso orario, sei sette o otto ore indietro rispetto al GMT, a seconda che sia in vigore l’ora legale. La seguente formula regolerà l’ora inserita in B7 di sette o otto ore, a seconda che la data associata all’ora rientri nel periodo dell’ora legale.

=IF(AND(B7>=DATEVALUE("3/8/2009 02:00"),B19<= DATEVALUE("11/01/2009 02:00")),B7+7/24,B7+8/24)

Ricorda che ogni volta che inserisci un’ora in una cella, Excel allega automaticamente una data. Pertanto, se si immette un’ora di 10:15 in una cella e il giorno in cui si immette è il 17 gennaio, Excel converte automaticamente la voce nella cella in 01/17/2009 10:15:00. Questa operazione viene eseguita anche se potresti visualizzare solo l’ora nella cella: in Excel, a ogni data è associata un’ora e ogni volta è associata a una data.

A causa di questo comportamento di immissione, Excel utilizzerà la formula appena mostrata per eseguire la regolazione corretta in base alla data predefinita quando si immette un’ora (data odierna) o una data che è possibile immettere esplicitamente.

L’unico inconveniente di questo approccio stereotipato è che devi ricordarti di cambiare le date del limite dell’ora legale di anno in anno.

(Quelle nella formula sono per il 2009.) È possibile modificare la formula in modo da memorizzare effettivamente le date di confine nelle celle, come E1 ed E2, come segue:

=IF(AND(B7>=$E$1,B19<=$E$2),B7+7/24,B7+8/24)

Sebbene la formula sia più breve, ha ancora un problema con la determinazione piuttosto statica dell’inizio e della fine dell’ora legale: è necessario ricordarsi di aggiornare manualmente le informazioni. Inoltre, se ci si sposta in un fuso orario diverso, è necessario ricordarsi di modificare i valori di regolazione della data e dell’ora.

Un modo davvero pratico per aggirare questi inconvenienti è creare una funzione definita dall’utente che accede all’interfaccia di Windows e determina quali sono le impostazioni di sistema del computer. Il sistema tiene traccia automaticamente dell’ora legale e del fuso orario in cui ci si trova. L’accesso a queste informazioni tramite una funzione definita dall’utente significa che non sarà mai necessario preoccuparsi di tali elementi nel foglio di lavoro. Puoi usare la seguente macro per fare proprio questo:

Option Explicit

Public Declare Function SystemTimeToFileTime Lib _   "kernel32" (lpSystemTime As SYSTEMTIME, _   lpFileTime As FILETIME) As Long

Public Declare Function LocalFileTimeToFileTime Lib _   "kernel32" (lpLocalFileTime As FILETIME, _   lpFileTime As FILETIME) As Long

Public Declare Function FileTimeToSystemTime Lib _   "kernel32" (lpFileTime As FILETIME, lpSystemTime _   As SYSTEMTIME) As Long

Public Type FILETIME     dwLowDateTime As Long     dwHighDateTime As Long End Type

Public Type SYSTEMTIME     wYear As Integer     wMonth As Integer     wDayOfWeek As Integer     wDay As Integer     wHour As Integer     wMinute As Integer     wSecond As Integer     wMilliseconds As Integer End Type

Public Function LocalTimeToUTC(dteTime As Date) As Date     Dim dteLocalFileTime As FILETIME     Dim dteFileTime As FILETIME     Dim dteLocalSystemTime As SYSTEMTIME     Dim dteSystemTime As SYSTEMTIME

dteLocalSystemTime.wYear = CInt(Year(dteTime))

dteLocalSystemTime.wMonth = CInt(Month(dteTime))

dteLocalSystemTime.wDay = CInt(Day(dteTime))

dteLocalSystemTime.wHour = CInt(Hour(dteTime))

dteLocalSystemTime.wMinute = CInt(Minute(dteTime))

dteLocalSystemTime.wSecond = CInt(Second(dteTime))



Call SystemTimeToFileTime(dteLocalSystemTime, _       dteLocalFileTime)

Call LocalFileTimeToFileTime(dteLocalFileTime, _       dteFileTime)

Call FileTimeToSystemTime(dteFileTime, dteSystemTime)



LocalTimeToUTC = CDate(dteSystemTime.wMonth & "/" & _       dteSystemTime.wDay & "/" & _       dteSystemTime.wYear & " " & _       dteSystemTime.wHour & ":" & _       dteSystemTime.wMinute & ":" & _       dteSystemTime.wSecond)

End Function

Questo può sembrare imponente, come spesso accade quando si lavora con le chiamate di sistema, ma funziona meravigliosamente. Esistono tre routine di sistema a cui si fa riferimento (SystemTimeToFileTime, LocalFileTimeToFileTime e FileTimeToSystemTime). Impostando le chiamate e utilizzandole in ordine, la data e l’ora vengono automaticamente adattate al GMT. Per utilizzare la funzione, nel tuo foglio di lavoro devi inserire questo per convertire l’ora nella cella B7:

=localtimetoutc(B7)

Formatta la cella come data / ora e l’output è esattamente quello che volevi.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (2185) si applica a Microsoft Excel 97, 2000, 2002 e 2003. Puoi trovare una versione di questo suggerimento per l’interfaccia a nastro di Excel (Excel 2007 e versioni successive) qui: