DevTrain

Autor: Till Groos

Wie alt bist du? Die Lösung mit DateTime und mit DateDiff

Aufgabe:

Errechnen des Alters in Jahren, Monaten und Tagen. Hört sich im den ersten Augenblick trivial an, ganz so einfach ist es aber nicht. Probieren wir's erst einmal mit den Boardmitteln des .NET Frameworks, hier mit der DateTime-Struktur. Die gibt uns die Jahres- Monats- und Tageskomponenten eines Datums. Mit ein bisschen überlegen kommt man auf folgendes:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Dim dateNow As DateTime = DateTime.Today heute
     Dim dateGeb As DateTime = Me.DateTimePicker1.Value 'das datum aus dem DateTimePicker
     Dim jahre, monate, tage As Integer 'ausgabe variablen
     Dim gebJahr, gebMonat, gebTag As Integer 'speichern das geburtsdatum
     Dim jetztJahr, jetztMonat, jetztTag As Integer 'speichern das heutige datum
     gebJahr = dateGeb.Year 'geburtsjahr
     gebMonat = dateGeb.Month 'geburtsmonat
     gebTag = dateGeb.Day 'geburtstag
     jetztJahr = dateNow.Year 'aktuelles jahr
     jetztMonat = dateNow.Month 'aktueller monat
     jetztTag = dateNow.Day 'aktueller tag
     If gebJahr <= jetztJahr Then 'wenn älter als 1 jahr
         If gebMonat <= jetztMonat Then 'und hatte schon geburtstag oder hat diesen monat
             jahre = jetztJahr - gebJahr
             monate = jetztMonat - gebMonat
         Else 'hat in diesem jahr noch geburtstag
             If Not gebJahr = jetztJahr Then 'aber nicht in diesem jahr (wäre falsches datum)
                 jahre = jetztJahr - gebJahr - 1
                 monate = jetztMonat + 12 - gebMonat
             Else
                 MessageBox.Show("Falsches Geburtsdatum. Du bist noch nicht geboren.", "Fehler") 'falsches datum
                 Exit Sub 'abbrechen
             End If
         End If
         If gebTag <= jetztTag Then 'hat an einem tag kleiner oder gleich den heutigen
             tage = jetztTag - gebTag
         Else ' hat an einem tag größer als dem heutigen
             monate -= 1
             If monate < 0 Then
                 jahre -= 1
                 monate = 12 + monate
             End If
             tage = jetztTag + DateTime.DaysInMonth(gebJahr, gebMonat) - gebTag
         End If
     Else 'falsche eingabe, datum liegt in der zukunft
         MessageBox.Show("Falsches Geburtsdatum. Du bist noch nicht geboren.", "Fehler")
         Exit Sub 'abbrechen
     End If
     MessageBox.Show("Du bist " & jahre & " Jahre, " & monate & " Monate und " & tage & " Tage alt", "Ausgabe")
End Sub

Ganz schön viel Code. Einfacher geht es, importiert man den Namespace Microsoft.VisualBasic und benutzt die DateDiff-Funktion:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim dateNow As DateTime = DateTime.Now
    Dim jahre, monate, tage
    Dim dateGeb As DateTime = Me.DateTimePicker1.Value
    If Not dateGeb > dateNow Then
        jahre = DateDiff(DateInterval.Year, dateGeb, dateNow) 'die Jahre
        dateNow = dateNow.AddYears(-jahre) 'abziehen der Jahre
        monate = DateDiff(DateInterval.Month, dateGeb, dateNow) 'monate
        If monate < 0 Then 'wird negativ, wenn monat noch ist
            monate = 12 + monate
            jahre -= 1
            dateNow = dateNow.AddYears(1)
        End If
        dateNow = dateNow.AddMonths(-monate) 'monate abziehen
        tage = DateDiff(DateInterval.Day, dateGeb, dateNow) 'tage
        If tage < 0 Then 'wird negativ, wenn tag noch ist
            tage = DateTime.DaysInMonth(dateNow.Year, dateNow.Month) + tage
            monate -= 1
        End If
        MessageBox.Show("Du bist " & jahre & " Jahre, " & monate & " Monate und " & tage & " Tage alt!")
    Else
        MessageBox.Show("Werd' erst mal Geboren, dann sehen wir weiter...")
    End If
End Sub

Einziger Unterschied:
Letzters Beispiel rechnet den heutigen Tag mit!
Das wäre mit C# nicht so einfach gewesen!

Ich bin offen für Verbesserungsvorschläge, falls jemand welche hat (auch in C#)!


Erfasst am: 23.09.2003 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=886
© Copyright 2003 ppedv AG - http://www.ppedv.de