Home Page Home Page Tips & Tricks Come modificare l'orario di sistema in VB.NET

Come modificare l'orario di sistema in VB.NET


Abbiamo sempre detto che il Framework seppur completo è sempre in qualche modo "parziale", ossia non tutte le funzionalità di Windows sono state "wrappate"/migrate. In particolare le API che sono nell'ordine delle migliaia non sono tutte accessibili utilizzando le classi managed di .NET.

Dobbiamo quindi dare uno sguardo al passato ed utilizzare le API di Win32 utilizzando l'interoperabilità, il namespace System.Runtime.InteropServices.
Proprio in questo Tip faremo ricorso all'interoperabilità per andare a modificare l'ora del sistema.

E'necessario prima di tutto importare il nostro namespace e successivamente definira la struttura SYSTEMTIME in questo modo:

Codice .NET n°1
    Public Structure SYSTEMTIME
Public wYear As UInt16
Public wMonth As UInt16
Public wDayOfWeek As UInt16
Public wDay As UInt16
Public wHour As UInt16
Public wMinute As UInt16
Public wSecond As UInt16
Public wMilliseconds As UInt16
End Structure


Ci servono inoltre due funzioni:

- GetSystemTime
- SetSystemTime


che andremo a definire di seguito:

Codice .NET n°2
    <DllImport("kernel32.dll")> _
Public Shared Sub GetSystemTime(ByRef lpSystemTime As SYSTEMTIME)
End Sub

<DllImport("kernel32.dll")> _
Public Shared Function SetSystemTime(ByRef lpSystemTime As SYSTEMTIME) As UInt32
End Function


A questo punto passiamo al codice vero e proprio.
Le due funzioni qui sopra definite svolgono la banale funzione di recuperare l'ora di sistema la prima e impostare una nuova ora di sistema la seconda.
La procedura quindi sarà:

- Definire una variabile/struttura di tipo SYSTEMTIME
- Recuperare l'ora riempiendo la struttura con la funzione GetSystemTime
- Modificare la struttura e quindi l'ora
- Riapplicare l'orario nuovo con la SetSystemTime

Ecco il codice:

VB.NET
Codice .NET n°3
'Inizializzazione Struttura
Dim ora As New SYSTEMTIME

'Recuperiamo l'ora corrente
GetSystemTime(ora)

'Modifichiamo i minuti a 45
ora.wMinute = UInt16.Parse("45")

'Riapplichiamo la nuova ora
SetSystemTime(ora)


In pochi semplici passi siamo riusciti ad ottenere un risultato egregio. Alcune volte ho trovato domande di questo tipo nel newsgroup o nei forum proprio perchè qualcuno voleva gestire automaticamente per esempio il cambio di ora legale o per altre ragioni. Personalmente non ho mai sentito la necessità di modificare via codice l'ora, ma se qualcuno ne avesse bisogno, ecco qua la soluzione!
Grazie a Giovanni Ferron per lo spunto per questo Tip.
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5