Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Prism Alter errechnung (https://www.delphipraxis.net/109048-alter-errechnung.html)

alixuszocker 23. Feb 2008 12:24


Alter errechnung
 
Hey leute, ich habe hier mal nen bissl gesucht habe aber nix gefunden.

Ich brauche Folgendes, ich möchte mir mein alter errechnen lassen, dass soll wie folgt funktionieren:

ich habe 2Edit Felder und eine Variable [alter] so jetzt soll das programm folgendes können.
Ich gebe in Edit1.Text mein Geburtsdatum ein zb 20.03.1990 so dann soll er jetzt das heutige datum nachschauen und sagen das man 17Jahre alt is und die 17jahre soll er auf edit2.text raus hauen und zusätzlich in die Variable alter rein schreiben wie alt man ist also 17 damit ich mit der variable alter noch etwas mehr machen kann aber das ist uninteressant.

wäre cool wenn mir hier einer helfen kann.

MFG Alex

patti 23. Feb 2008 12:34

Re: Alter errechnung
 
Du hast eine Delphi(.Net)-Thema eröffnet, aber du meinst wohl eher Delphi(Win32). Vielleicht könntest du das noch ändern. Hier mal einpaar Stichwörter, die dir helfen könnten:

StrToDate, Date(now), DateToStr

Du kannst Datumswerte einfach voneinander abzeihen, also z.B.

Delphi-Quellcode:
Diff := Wert2 - Wert1;
Hoffe, ich konnte dir zumindest etwas weiterhelfen!

grenzgaenger 23. Feb 2008 12:35

Re: Alter errechnung
 
nimm doch 'n tDateEdit, dann gehts wie folgt Alter := date - DatumEingabe.value;

that's all.

DeddyH 23. Feb 2008 12:39

Re: Alter errechnung
 
Wenn Du mit TDateTime-Werten rechnest, erhältst Du die Differenz in Tagen und müsstest noch alle Schaltjahre ermitteln, die zwischen den beiden Daten liegen. Ich würde das wohl eher mit TSystemTime machen, etwa so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var heute, GebDat: TSystemTime;
    Alter: byte;
begin
  DateTimeToSystemTime(now,heute);
  DateTimeToSystemTime(StrToDateTime(Edit1.Text),GebDat);
  Alter := heute.wYear - GebDat.wYear;
  if heute.wMonth < GebDat.wMonth then
    dec(Alter)
  else if (heute.wMonth = GebDat.wMonth) and (heute.wDay < GebDat.wDay) then
    dec(Alter);
  Edit2.Text := inttostr(Alter);
end;
Allerdings findet hier keine Fehlerbehandlung statt, die musst Du schon selbst implementieren.

Phoenix 23. Feb 2008 12:46

Re: Alter errechnung
 
Wenns wirklich .NET ist ist das supereasy ;-)
Der Datentyp System.DateTime bzw. TimeSpan kann das nämlich aus dem FF:

Delphi-Quellcode:
var geburtstag: System.DateTime;
var heute: System.DateTime;
var diff: System.TimeSpan;
begin
  heute := DateTime.Today;
  geburstag := DateTime.Parse(textbox1.Text);
  diff := heute - geburtstag;
  textbox2.Text := (diff.Days / 365).ToString();
end;

DeddyH 23. Feb 2008 12:50

Re: Alter errechnung
 
Bist Du sicher, dass das auch mit den Schaltjahren funktioniert? Die 365 finde ich etwas optimistisch.

mkinzler 23. Feb 2008 12:52

Re: Alter errechnung
 
Ich würde zuerst nur die Jahreszahlen betrachten und dann überprüfen welches der beiden Daten vorher ist und dementsprechend die Jahre dann anpassen

Thanatos81 23. Feb 2008 12:55

Re: Alter errechnung
 
Unter Delphi32 würde ich einfach YearsBetween aus der Unit DateUtils nutzen. Wobei das mit Schaltjahren nicht 100%ig genau ist, da es nicht alle Schaltjahre raussucht sondern mit 365,25 Tagen pro Jahr rechnet.

DeddyH 23. Feb 2008 12:57

Re: Alter errechnung
 
Zitat:

Zitat von mkinzler
Ich würde zuerst nur die Jahreszahlen betrachten und dann überprüfen welches der beiden Daten vorher ist und dementsprechend die Jahre dann anpassen

Genauso mache ich es ja in meinem Beispiel (allerdings nicht in .NET :mrgreen: )

Phoenix 23. Feb 2008 13:00

Re: Alter errechnung
 
Zitat:

Zitat von DeddyH
Bist Du sicher, dass das auch mit den Schaltjahren funktioniert? Die 365 finde ich etwas optimistisch.

Nicht wirklich. ;-)
Nehmen wir an, N sei eine glatte Zahl ohne Nachkommastellen.
Das ganze wird genau dann ein klein wenig ungenau, wenn (Anzahl Tage / 365) plus minus (N/4) Tage an ein N herankommt.
Für diese Zeiträume kann man dann nochmach nachprüfen, ob das aktuelle Datum (Tag, Monat) kleiner ist als der eingegebene Geburstag und wenn ja, 1 von der Anzahl der Jahre abziehen wenn wir knapp _über_ N sind. Wenn wir unter N sind passt das ja.

mkinzler 23. Feb 2008 13:11

Re: Alter errechnung
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von mkinzler
Ich würde zuerst nur die Jahreszahlen betrachten und dann überprüfen welches der beiden Daten vorher ist und dementsprechend die Jahre dann anpassen

Genauso mache ich es ja in meinem Beispiel (allerdings nicht in .NET :mrgreen: )

Sorry, deinen 1. Beitrag hab ich irgendwie übersehen :oops:

Sascha L 23. Feb 2008 14:43

Re: Alter errechnung
 
Also wenn man nur das Alter in Jahren haben möchte, dann kann man die Schaltjahre vernachlässigen. Denn so lange lebt kein Mensch, als dass es aufgrund der Schaltjahre zu einem Rechnungsfehler von z.B. einem Jahr kommt :D Man muss bei der Division durch 365 einfach nur die Nachkommastellen vernachlässigen bzw. immer auf eine glatte Zahl auf oder abrunden.

DeddyH 23. Feb 2008 14:46

Re: Alter errechnung
 
Du hast mich nicht verstanden. Wenn man z.B. am 20.03. Geburtstag hat, kommt bei Nichtberücksichtigung von Schaltjahren am 19.03. evtl. das falsche Ergebnis heraus, wenn man einfach die Anzahl der Tage durch 365 teilt.

Jürgen Thomas 23. Feb 2008 15:50

Re: Alter errechnung
 
Ich dachte, nach so vielen Beiträgen wäre die vollständige Lösung schon dabei. Nun ja...

Vorausgesetzt, dass wirklich nach einer NET-Lösung gefragt wird, kann man direkt mit Monat und Tag vergleichen:
Code:
DateTime geburtstag = ...
DateTime vergleich = DateTime.Today();
int alter = vergleich.Year - geburtstag.Year;
// korrigieren, wenn im aktuellen Jahr noch kein Geburtstag war
if (  (geburtstag.Month > vergleich.Month)
   || (geburtstag.Month == vergleich.Month && geburtstag.Day > vergleich.Day) )
  alter--;
(und das in Delphi zu schreiben statt in C#, überlasse ich Euch).

Das Ganze kann man natürlich auch mit mehrfachem Vergleich von IsLeapYear für Geburtstag und Heute machen; aber ich glaube, dieser Weg ist kürzer und einfacher.

Gruß Jürgen

PS. Sorry, ich stelle gerade fest, dass DeddyH in #4 und mkinzler in #7 dasselbe Verfahren meinten. Mein Beitrag dient also nur dazu, eine NET-Lösung zu schreiben und nicht nur zu skizzieren.

sx2008 23. Feb 2008 16:45

Re: Alter errechnung
 
So geht's richtig (so wie es mkinzler schon angedeutet hat und natürlich auch DeddyH):
akt. Datum und Geburtstag nach Jahr,Monat und Tag zerlegen. (DecodeDate()-Funktion)
Alter = AktJahr-GebJahr;
Jetzt muss man noch prüfen, ob man dieses Jahr schon Geburtstag hatte.
Falls nicht, muss ein Jahr vom Alter abgezogen werden.
Delphi-Quellcode:
if (GebMonat*100+GebTag) > (AktMonat*100 + AktTag) then
  Dec(Alter);
// anstelle der Zahl 100 hätte man jede Zahl >= 31 nehmen können
// Hardcode Programmierer würden hier 32 nehmen und als "shl 5" einbauen

alixuszocker 24. Feb 2008 14:47

Re: Alter errechnung
 
Sry leute ich muss mich verbessern ich habe win32 ichw erde mich gleich mal rann machen und schauen ob ich was hinbekomme

alixuszocker 24. Feb 2008 14:53

Re: Alter errechnung
 
gut ich habe es hin bekommen ich wollte mich herzlich bedanken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz