Uncategorized

Date e ore da DMTF a .NET

Se vi siete mai interessati a tutto il set di strumenti messi a disposizione dal WMI, sicuramente avrete affrontato il problema di convertire le date e ore fornite dalle proprietà di WMI in un formato leggibile dall’uomo, ma soprattutto trattabile dal .NET Framework in maniera programmatica.
Bene, forse non tutti sanno che WMI usa lo standard definito dall’organizzazione DMTF, un gruppo dedicato alla definizione e alla distribuzione di standard industriali per promuovere l’interoperabilità.

Sfortunatamente questo standard non supportato direttamente dal Framework, ma in effetti può essere facilmente interpretata da questo
Per prima cosa, vi dico che il formato dati è così formattato yyyyMMddHHmmss.ffffffSNNN dove

  • yyyy è l’anno
  • MM il mese
  • dd il giorno del mese
  • HH è l’ora del giorno
  • mm i minuti dell’ora
  • ss i secondi
  • ffffff le frazioni dei secondo
  • SNNN rappresenta il fuso orario indicato con il segno S (+ o -, a Est o a Ovest) e i minuti NNN

Mentre la prima parte della data e ora così formattata può essere convertita agevolmente con l’aiuto del metodo DateTime.ParseExact, l’offset del fuso orario da Greenwich è scritta in una maniera che non è riconosciuta dal Framework.
Per risolvere il problema, ho implementato la seguente funzione:

<blockquote>
<p class="inlinecode">Function DMTFToDate(ByVal dmtfString As String) As Date
 Dim dmtfPattern As String
 Dim minutes As Integer
 Dim offset As String
 Dim okString As String</p>
dmtfPattern = "yyyyMMddHHmmss.ffffffzzzzzz"
 minutes = CInt(dmtfString.Substring(22, 3))
 offset = (minutes / 60).ToString.PadLeft(2, "0") & ":" & (minutes Mod 60).ToString.PadLeft(2, "0")

okString = dmtfString.Substring(0, 22) & offset

Return DateTime.ParseExact(okString, dmtfPattern, New CultureInfo(""))

End Function

Dopo aver calcolato la quantità di minuti effettuando la conversione del testo ‘120’, trasformo questi in ore, accodo il segno ‘:’ e, infine, appendo a questa stringa i minuti che restano dalla divisione per 60.
Dopo aver accodato questa stringa alla prima parte della data in formato DMTF, arriviamo finalmente all’applicazione di ParseExact passando alla funzione la stringa appena modificata, la stringa formattata secondo gli standard del .NET (l’unica differenza, sono le 6 z in coda che permettono al Framework di identificare la stringa appena modificata come l’offset della Zona) e una cultura generica.
Il risultato è un oggetto DateTime che viene restituito dalla funzione e che può essere manipolato in tutti i modi propri delle funzioni del Framework.

Annunci
Standard

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...