Ik vervolg mijn serie van artikelen over operators in .NET met deze keer aandacht voor bewerkingen op het datum/tijd type, DateTime. Het eerste artikel over String Operators vindt u hier: http://vbcentral.nl/Blog/tabid/103/entryid/26/Standaard-operators-in-NET-Deel-1.aspx en het tweede over de numerieke operators hier: http://vbcentral.nl/Blog/tabid/103/entryid/40/Standaard-operators-in-NET-Deel-2.aspx

Een DateTime in .NET heeft een minimale- en een maximale waarde. DateTime.minValue levert 01-01-0001 op en de maxValue 31-12-9999.

Datum aanmaken

Het aanmaken van een nieuwe datum in .NET gaat met:

  1: 'Nieuwe datum aanmaken. Jaar, maand, dag
  2:         Dim d As New DateTime(2012, 3, 19)

Als ik deze zou weergeven met: MessageBox.Show(d.ToLongDateString) dan zou het op mijn systeem ‘maandag 19 maart 2012’ weergeven. We kunnen overigens ook Date schrijven i.p.v. DateTime. Als we bij een DateTime type de tijd niet opgeven wordt op de achtergrond 12:00AM toegevoegd.

We kunnen een datum ook als een ‘literal’ tekst schrijven. Bijvoorbeeld:

  1: Dim d2 As Date = #3/19/2012#

 

Ook hier schrijven we weer eerst de maand dan de dag vanwege de Amerikaanse notatie in .NET code.

Weergave van een datum en tijd

Nu we weten hoe we een datum kunnen aanmaken kunnen we er ook bewerkingen op doen. En daar gaat dit artikel dan ook over.
Eerst kijken we naar de weergave van een datum en tijd. Wat meteen opvalt is dat onze applicatie de datum wel weergeeft in het Nederlands. Dit komt omdat mijn Windows (Regio instelling) op het Nederlands staat ingesteld.

  1:  d = DateTime.Now
  2: 
  3: 'Tekst weergave van een datum
  4: Dim korteDatumWeergave As String = d.ToShortDateString '19-3-2012
  5: Dim langeDatumWeergave As String = d.ToLongDateString 'maandag 19 maart 2012
  6: Dim korteTijdWeergave As String = d.ToShortTimeString '13:05 (hh:mm)
  7: Dim langeTijdWeergave As String = d.ToLongTimeString '13:05:31 (hh:mm:ss - inclusief seconden)

We kunnen ook een eigen formaat meegeven. Die kunnen we kwijt in de ToString(…) methode. Waarbij d staat voor dag, M (hoofdletter) voor maand en y voor het jaar. Voor de tijd gebruiken we h voor de uren en m (klein) voor de minuten. Als we een 24-uurs notatie willen schrijven voor de tijd, dan gebruiken we HH voor de uren i.p.v. hh.

  1:  'Eigen Datum/Tijd formaat
  2:         MessageBox.Show(d.ToString("d MMMM yyyy HH:mm")) 'Geeft 19 maart 2012 13:05

Ook kunnen we losse gedeelten van een datum bepalen zoals de dag, maand of jaar. Een aantal voorbeelden:

  1:  'Dagen, maanden en jaren weergeven
  2:         d = #3/19/2012#
  3:         Dim dag As Integer = d.Day '19
  4:         Dim maand As Integer = d.Month '3
  5:         Dim jaar As Integer = d.Year '2012
  6:         Dim dagVanJaar As Integer = d.DayOfYear '79
  7:         Dim dagVanWeek As Integer = d.DayOfWeek '1
  8:         Dim aantalDagenInMaand As Integer = DateTime.DaysInMonth(2012, 3) '31

 

Rekenen met een datum

We kunnen ook rekenen met een datum. We kunnen er dagen, maanden of jaren bij optellen of aftrekken, maar ook het verschil uitrekenen tussen twee data is mogelijk. De voorbeelden wijzen voor zich.

  1:  'Bewerkingen op een datum
  2:         Dim d As DateTime = #3/19/2012#
  3: 
  4:         'Controleren of het vandaag maandag is
  5:         If d.DayOfWeek = vbMonday Then
  6:             'ja het is maandag
  7:         Else
  8:             'Nee het is een andere dag
  9:         End If
 10: 
 11:         'Controleren of het jaar een schrikkeljaar is
 12:         If DateTime.IsLeapYear(d.Year) Then
 13:             'ja het is een schrikkeljaar
 14:         Else
 15:             'nee dit jaar niet
 16:         End If
 17: 
 18:         'Nieuwe datum berekenen die 30 dagen verder ligt dan onze huidige datum
 19:         Dim vervaldatum As Date = d.AddDays(30)
 20: 
 21:         'Nieuwe datum berekenen die 30 dagen terug ligt
 22:         Dim vorigeDatum As Date = d.AddDays(-30)
 23: 
 24:         'Verschil berekenen tussen 2 data
 25:         Dim d1 As Date = #12/31/2012#
 26:         Dim d2 As Date = Today
 27: 
 28:         Dim verschil As TimeSpan = d1.Subtract(d2)
 29:         MessageBox.Show(String.Format("Tot Oudjaarsdag is het nog {0} dagen.", verschil.Days.ToString()))

 

 

Controleren of een tekst een geldige datum is

Als we via een control, de TextBox bijvoorbeeld een datum krijgen, dan moet je er rekening mee houden dat dat altijd een tekst is en geen datum. Tenzij de datum via een Calendar control komt. We moeten de datum die een String is dan ook gaan omzetten naar een datum.

Als de Regio setting in Windows op Nederlands staat en je hebt in je applicatie niets ingesteld, dan zal de UI van je applicatie een DateTime datatype in het Nederlandse formaat weergeven en ook zo behandelen. Dit geldt overigens ook voor de notatie van komma getallen.

We moeten nu alleen de inhoud van de TextBox gaan omzetten naar een DateTime type om er verdere bewerkingen mee te kunnen doen. Dat kunnen we bijvoorbeeld doen met Convert.ToDateTime(me.TextBox1.Text) maar beter is Parse of TryParse omdat we werken met een String naar DateTime conversie.

  1:  'Converteren van een tekst naar een datum
  2: Me.VandaagTextBox.Text = Date.Today.ToShortDateString
  3: 
  4: Dim d As DateTime = Convert.ToDateTime(VandaagTextBox.Text)
  5: MessageBox.Show(d.ToLongDateString)

Met de methode Parse of TryParse kunnen we een tekst omzetten naar een datum en met TryParse zelfs controleren of een datum geldig is.

In het code voorbeeld voer ik bijvoorbeeld 31 februari 2012 in de TextBox in, hetgeen natuurlijk geen geldige datum is. In het geval van de Parse functie krijgen we een FormatException en in het geval van de TryParse een False terug. Met de TryParse functie kunnen we dus gecontroleerd een fout afvangen en dit teruggeven als Boolean. Deze TryParse functie zouden we in een eigen Method of Extension Method kunnen stoppen en bijvoorbeeld IsValidDate kunnen noemen en is dan een .NET equivalent van de VB6 IsDate() functie.

  1: Me.VandaagTextBox.Text = "31-02-2012" 'Date.Today.ToShortDateString
  2: 
  3:         Try
  4: 
  5:             ''Het gebruik van Parse
  6:             Dim controleDatum As New DateTime
  7:             controleDatum = DateTime.Parse(Me.VandaagTextBox.Text)
  8: 
  9:             'TryParse. Hiermee controleren we of een tekst voorstelling van een datum geldig is
 10:             If DateTime.TryParse(Me.VandaagTextBox.Text, controleDatum) Then
 11:                 'Datum is geldig
 12:             Else
 13:                 'Datum is niet geldig
 14:                 MessageBox.Show("De ingevoerde datum is niet geldig")
 15:             End If
 16: 
 17:         Catch ex As FormatException
 18:             'Geen geldige datum
 19:             MessageBox.Show("De ingevoerde datum is niet geldig")
 20: 
 21:         End Try

Hierbij zijn we aan het eind gekomen van deze 3-delige serie over standaard Operators in .NET.