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#)!