Rubrik: Datum/Zeit und Timer · Datums- und Zeitfunktionen | VB-Versionen: VB6 | 16.10.03 |
Zeitspanne zwischen zwei Datums-Werten berechnen Diesmal zeigen wir Ihnen, wie man die vergangene Zeit zwischen zwei Datums-Angaben ermittelt - Jahre, Monate und Tage. | ||
Autor: Guido Eisenbeis | Bewertung: | Views: 34.228 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Es wird immer wieder gefragt: "Wie kann ich die Zeitspanne zwischen einem Datum 1 und einem Datum 2 anzeigen?"
Beispielweise die vergangene Zeit zwischen meinem Geburtsdatum und heute?
Das geht ganz einfach mit der DateDiff-Funktion, die schon im Tipp Erklärung der DateDiff-Funktion sehr anschaulich beschrieben wird.
Die DateDiff-Funktion ermittelt die Zeitspanne aber leider nur in Jahren oder Monaten oder Tagen, z.B.: "Sie sind heute 14781 Tage alt."
Viel schöner wäre es doch, wenn man die Zeitspanne in folgender Form zurückerhalten würde:
"Sie sind heute 29 Jahre, 4 Monate und 22 Tage alt" (Kleines Wunschdenken von mir
Und das liefert folgender Code, den Sie in ein Modul einfügen müssen:
Option Explicit ' in dieser Struktur wird die ' Zeitdifferenz gespeichert Public Type tDateDiff Years As Long Months As Long Days As Long End Type
Public Function GetDateDiff(ByVal vDateBegin As Variant, _ ByVal vDateEnd As Variant) As tDateDiff ' Hilfsvariable Dim vTemp As Variant ' Datums-Werte nach Typ DATE umwandeln vDateBegin = CDate(vDateBegin) vDateEnd = CDate(vDateEnd) With GetDateDiff .Years = 0 .Months = 0 .Days = 0 ' Als erstes ermitteln wir die Jahre mit der DateDiff-Funktion. ' Da diese aber sagt, dass es 2 Jahre sind, egal ob wir z.B. ' von Januar 2000 bis Dezember 2002 eingeben oder ' von Dezember 2000 bis Januar 2002, ermitteln wir lieber die ' Monate. ' Beispiel: von "10.02.2001" bis "31.12.2003" .Months = DateDiff("m", vDateBegin, vDateEnd) ' Die Monate rechnen wir in Jahre plus Monate um, ' und erhalten als Ergebnis: 2 Jahre und 10 Monate .Years = Int(.Months / 12) .Months = .Months - (.Years * 12) ' Jetzt brauchen wir noch die Tage. Dazu addieren wir unsere ' ermittelten Jahre zum Anfagsdatum hinzu. ' Beispiel: "10.02.2001" + 2 Jahre = "10.02.2003" vTemp = DateAdd("yyyy", .Years, vDateBegin) ' und dann die ermittelten Monate: + 10 Monate = "10.12.2003" vTemp = DateAdd("m", .Months, vTemp) ' Wir berechnen die Tage zwischen dem so gewonnenen ' Hilfsdatum und dem EndDatum. ' von "10.12.2003" bis "31.12.2003" = 21 Tage. Stimmt. .Days = DateDiff("d", vTemp, vDateEnd) ' Ist die Tagesangabe des Anfangsdatum jedoch höher als die ' des Enddatums, z.B. "10.02.2001" bis "01.12.2003", so ' bekämen wir eine negative Anzahl-Tage heraus: -9 Tage ' Also ziehen wir einfach von der ermittelten Anzahl-Monate ' einen ab und wandeln ihn in Tage um. Schon stimmt wieder ' alles. If .Days < 0 Then .Months = .Months - 1 vTemp = DateAdd("yyyy", .Years, vDateBegin) vTemp = DateAdd("m", .Months, vTemp) .Days = DateDiff("d", vTemp, vDateEnd) End If ' 25.04.2014: Erweiterung ' Monatsangabe des Anfangsdatums höher als die des Enddatums If .Months < 0 Then .Months = 11 .Years = .Years - 1 End If End With End Function
Anwendungsbeispiel:
Dim vDateBegin As Variant Dim vDateEnd As Variant Dim tDiff As tDateDiff ' Anfangsdatum vDateBegin = "01.01.2001" ' Enddatum: Heute vDateEnd = Now ' Zeitspanne ermitteln und in Label-Felder ausgeben tDiff = GetDateDiff(vDateBegin, vDateEnd) With tDiff lblYears.Caption = CStr(.Years) lblMonths.Caption = CStr(.Months) lblDays.Caption = CStr(.Days) End With