Oppure

Loading

Il tipo di dato standard che il .NET Framework mette a disposizione per lavorare cone le date e gli orari è Date, facente parte del Namespace System. Per compatibilità con il vecchio Visual Basic 6, è presenta anche System.DateTime, che rappresenta la stessa identica entità. Con questo semplice tipo è possibile fare di tutto e perciò non è necessario definire manualmente alcun metodo nuovo quando si lavora con le date. Ecco un elenco dei metodi e delle proprietà più importanti:

  • Add(t): aggiunge alla data un fattore t di tipo TimeSpan contenente una durata di tempo
  • AddYears, AddMonths, AddDays, AddHours, AddMinutes, AddSeconds, AddMilliseconds: aggiungono un fattore t di anni, mesi, giorni, ore, minuti, secondi, millisecondi alla data, specificata come unico parametro
  • Year, Month, Day, Hour, Minute, Second, Millisecond: restituiscono l'anno, il mese, il giorno, l'ora, i minuti, i secondi o i millisecondi della data contenuta nella variabile
  • DayOfWeek: restituisce un enumeratore che rappresenta il giorno della settimana contenuto nella data della variabile
  • DayOfYear: restituisce un numero che indica il numero del giorno in tutto l'anno
  • DaysInMonth(y, m): restituisce il numero di giorni del mese m dell'anno y
  • Now: proprietà shared che restituisce la data corrente (Date.Now)
  • Parse(s): funzione shared che converte la stringa s in una data; utile per quando si deve salvare una data su file
  • Subtract(d): sottrae alla data della variabile la data d, restituendo un valore di tipo TimeSpan (ossia 'tempo trascorso')
  • ToLongDateString: converte la data in una stringa, espandendo la data in questo formato: [giorno della settimana] [giorno del mese] [mese] [anno] (esempio: venerdì 30 giugno 2006)
  • ToLongTimeString: converte l'ora della data in una stringa, espandendola in questo formato: [ore].[minuti].[secondi] (esempio: 13.13.07)
  • ToShortDateString: converte la data in una stringa, contraendola in questo formato: [giorno del mese][mese][anno] (esempio: 30/6/2006)
  • ToShortTimeString: converte l'ora della data in una stringa, contraendola in questo formato: [ore].[minuti] (esempio: 13.13)
  • ToFileTime : funzione curiosa, che restituisce la data in formato file, ossia come multiplo di intervalli di 100 nanosecondi trascorsi dal primo gennaio 1601 alle ore 12.00 di mattina
  • TryParse(s, r): tenta di convertire la stringa s in una data: se ci riesce, r assume il valore della data (r è passata per indirizzo) e restituisce True; se non ci riece, restituisce False

Parallelamente, viene definito anche il tipo TimeSpan ("tempo trascorso") che rappresenta un lasso di tempo e si ottiene con la differenza di due valori Date. Ha le stesse proprietà sopra elencate, fatta eccezione per alcune che possono rivelarsi interessanti, come FromDays, FromHours, FromSeconds, FromMinutes, FromMilliseconds: funzioni shared che creano un valore di tipo TimeSpan a partire da un ammontare di giorni, ore, minuti, secondi o millisecondi.

Esempio: A long, long life

Ecco un esempio molto semplice e divertito che applica i concetti sopra esposti. Lo scopo del programma è di calcolare con una buona precisione la durata della nostra vita, avendo immesso precedentemente la data di nascita. Il controllo usato è DateTimePicker, le cui proprietà sono autoesplicative. Per ora prenderò in analisi solo le proprietà Format e CustomFormat. La prima permette di definire il formato del controllo: è rappresentata da un enumeratore che può assumere quattro valori, Long (data in formato esteso, come la restituisce la funzione Date.ToLongDateString), Short (data in formato breve, come la restituisce la funzione Date.ToShortdateString), Time (ora in formato esteso) e Custom (personalizzato). Se viene scelta l'ultima opzione, si deve impostare la stringa CustomFormat in modo da riprodurre il valore in conformità ai propri bisogni. Nella stringa possono presenziare queste sequenze di caratteri:

  • d : giorno del mese, con una o due cifre a seconda dei casi
  • dd : giorno del mese, sempre con due cifre (vengono aggiunti zeri sulla sinistra nel caso manchino posti)
  • ddd : giorno della settimana, abbreviato a tre caratteri secondo la cultura corrente
  • dddd : giorno della settimana, con nome completo
  • M : mese, con una o due cifre a seconda dei casi
  • MM : mese, sempre con due cifre
  • MMM : nome del mese, abbreviato a tre caratteri secondo la cultura corrente
  • MMMM : nome completo del mese
  • y : anno, con una o due cifre a seconda dei casi
  • yy : anno, sempre con due cifre
  • yyyy : anno, a quattro cifre
  • H : ora, in formato 24 ore con una o due cifre
  • HH : ora, in formato 24 ore con due cifre
  • h : ora, in formato 12 ore, con una o due cifre
  • hh : ora, in formato 12 ore, con due cifre
  • m : minuti, con una o due cifre
  • mm : minuti, con due cifre
  • s : secondi, con una o due cifre
  • ss : secondi, con due cifre
  • f : frazioni di secondo (un numero qualsiasi da uno a sette di "f" consecutive corrisponde ad altrettanti decimali)

Dato che il controllo dovrà esporre il valore in formato:

[nome giorno] [giorno] [nome mese] [anno], ore [ora]:[minuti] 

La stringa di formato da inserire sarà:

dddd d MMMM yyyy, ore HH:mm 

Gli stessi pattern valgono anche se posti come argomento della funzione Date.ToString("Formato"). I controlli da aggiungere sono un DateTimePicker (dtpBirthday), con una label di spiegazione a fianco, una label che visualizzi i risultati (lblAge) e un timer (tmrRefresh) per aggiornare il risultato a ogni secondo che passa. Ora non resta che scrivere il codice, per altro molto semplice. Il sogente fa uso di un controllo Timer, che una volta abilitato (Timer.Enabled=True o Timer.Start()), lancia un evento Tick ogni Timer.Interval millisecondi circa (il valore è molto variabile, a seconda della velocità del computer su cui viene fatto correre).

Class Form1
    Private Sub tmrRefresh_Tick(ByVal sender As Object, _ 
        ByVal e As EventArgs) Handles tmrRefresh.Tick
        'Ottiene la differenza tra le due date
        Dim Age As TimeSpan = (Date.Now - dtpBirthDay.Value)
        'La trasforma in secondi
        Dim Seconds As Double = Age.TotalSeconds
        'Variabile temporanea che serve alla costruzione
        Dim AgeStr As New System.Text.StringBuilder

        With AgeStr
            .AppendLine("Hai vissuto")

            'Calcola i giorni secondo il modo già visto nelle prime
            'lezioni sulle classi e le proprietà
            .AppendFormat("{0} giorni{1}", Seconds  (60 * 60 * 24), vbCrLf)
            Seconds -= (Seconds  (60 * 60 * 24)) * (60 * 60 * 24)

            'E così anche ore, minuti e secondi
            .AppendFormat("{0} ore{1}", Seconds  3600, vbCrLf)
            Seconds -= (Seconds  3600) * 3600

            .AppendFormat("{0} minuti{1}", Seconds  60, vbCrLf)
            Seconds -= (Seconds  60) * 60

            .AppendFormat("{0:n0} secondi", Seconds)

            'Quindi mette il risultato come testo della label
            lblAge.Text = .ToString
        End With
    End Sub
End Class 

Per il mio caso, il risultato è questo:
DateTimePicker.jpg

A cura di: Il Totem