Geburtstag Alter vergleich

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Geburtstag Alter vergleich

    Hallo Community,

    ich stehe gerade vor einem Problem in dem ich gern das eingegebene Alter einer Textbox mit dem Datum einem DateTimePicker vergleichen möchte.

    Stehe mit VB noch ziemlich am Anfang da ich versuche mir alles selbst beizubringen mit "Learning by Doing" :)

    Hier mal mein Codeabschnitt:

    Quellcode

    1. Sub GeburtstagAlter()
    2. If (DateTime.Now.Year - Einstellungen.DTP_Geburtstag.Value.Year) <> Einstellungen.TBAlter.Text Then
    3. GeburtstagAlters = MsgBox("Du hast das Falsche Geburtsdatum angegeben oder dein Alter ist falsch!", vbOK + MsgBoxStyle.Critical, "Falsches Datum oder Alter")
    4. End If
    5. End Sub


    So wie ich es jetzt habe vergleicht er die Jahre. Klappt soweit ganz gut wenn man dieses Jahr schon Geburtstag hatte :D

    Das Einstellungen ist ein WindowsForm.


    Kann mir da jmd Weiterhelfen?
    In der Textbox steht Text (Datentyp Text), im DateTimePicker steht ein Wert vom Datentyp DateTime. Direkt vergleichen kannst Du das nicht.
    Also musst Du aus der Texteingabe einen gültigen Wert des Datentyps DateTime machen.
    Dazu nimmst du DateTime.TryParse
    Von hier an kannst du Vergleiche anstellen wie Du willst.
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed
    Das mit dem DateTime.TryParse versteh ich aktuell nicht. Wenn ich:

    Quellcode

    1. Datetime.Tryparse(Einstellungen.TBAlter.Text)


    eingebe bekomme ich einen Fehler zurück.

    Kann mir das bitte nochmal jemand erklären?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Dksksm schrieb:

    In der Textbox steht Text
    Da wäre das Beste, anstatt einer Textbox eine NumericUpDown zu verwenden, dann kann man sich das Parsen sparen.

    VB.NET-Quellcode

    1. If (DateTime.Today - Einstellungen.DTP_Geburtstag.Value).Years <> Einstellungen.NUDAlter.Value Then

    Ansonsten ist DateTime.TryParse der falsche Ansatz, wenn schon parsen, dürfte für eine Altersangabe Integer.TryParse wohl eher geeignet sein.

    VB.NET-Quellcode

    1. ​Dim Age As Integer
    2. If Integer.TryParse(Einstellungen.TBAlter.Text, Age) AndAlso (DateTime.Today - Einstellungen.DTP_Geburtstag.Value).Years <> Age Then


    @Gurke258:
    Wenn das Original fehlerfrei kompiliert hat, ist eine dringende Empfehlung für Option Strict On angebracht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    Quellcode

    1. If (DateTime.Today - Einstellungen.DTP_Geburtstag.Value).Years <> Einstellungen.NUDAlter.Value Then


    Ich kann nachwievor kein .Years oder .TotalYears einfügen, da es nicht verfügbar ist :/
    jo, isses eben niht.
    Der Ausdruck DateTime.Today - Einstellungen.DTP_Geburtstag.Value ergibt - Option Strict On vorrausgesetzt - einen Timespan, also eine Zeitspanne.
    Und Zeitspannen kann man nicht in Jahren angeben, weil Jahre sind ja unterschiedlich lang.
    Du kannst Timespan.Days nehmen, und durch 365,25 teilen, das ergibt eine recht gute Annäherung - üblicherweise will man derart grosse Zeitspannen ja eh gerundet haben.

    Gurke258 schrieb:

    kein .Years oder .TotalYears

    Jetzt habe ich extra mein Visual Studio angeworfen und musste feststellen, dass du recht hast.
    Timespan hat tatsächlich keine Years-Property. Ich hätte schwören können...

    Dann müssen wir wohl deinen Ursprünglichen Ansatz erweitern

    VB.NET-Quellcode

    1. Dim t1 = Einstellungen.DTP_Geburtstag.Value
    2. Dim t2 = DateTime.Today
    3. Dim age = t2.Year - t1.Year + If(t2.DayOfYear < t1.DayOfYear, -1, 0)
    4. If age <> Einstellungen.NUDAlter.Value Then
    5. ...
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    ErfinderDesRades schrieb:

    Option Strict On vorrausgesetzt


    Da muss ich ja meinen kompletten Code überarbeiten, was da an Fehlern drin ist :D Aber danke dir ^^

    VB.NET-Quellcode

    1. Dim t1 = Einstellungen.DTP_Geburtstag.Value
    2. Dim t2 = DateTime.Today
    3. Dim age = t2.Year - t1.Year + (If(t2.DayOfYear < t1.DayOfYear, -1, 0))
    4. If age <> Einstellungen.NUDAlter.Value Then
    5. ...



    Hab gelöst :) Das IF musste nochmal eingeklammert werden :)

    Vielen Dank für die Hilfe :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Gurke258“ ()

    petaod schrieb:

    VB.NET-Quellcode

    1. Dim age = t2.Year - t1.Year + If(t2.DayOfYear < t1.DayOfYear, -1, 0)
    ist wohl nicht ganz richtig.
    @Gurke258 Wenn Du den Altersunterschied ausrechnen willst, mach die Differenz der Jahre und ggf. der Monate.
    Was ganz genau willst Du denn berechnen?
    Aus Deiner ursprünglichen Fragestellung werd ich nicht ganz schlau.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vollzitat eines Vorposts an dieser Stelle entfernt ~VaporiZed

    Ich wollte einfach nur einen Vergleich haben, wenn man in einem Zahlenfeld sein aktuelles Alter angibt und dann in einem DateTimePicker das Geburtsdatum, dann soll ein Vergleich stattfinden ob das Alter aus dem Zahlenfeld auch wirklich dem entspricht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Gurke258 schrieb:

    auch wirklich dem entspricht.
    Da musst Du schon ein wenig aufpassen. Wenn der Bediener gestern oder morgen Geburtstag hat(te), kommt da ggf. ein Jahr mehr oder weniger Differenz raus.
    Teste das gezielt an speziellen Konstellationen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!