Entwickler-Ecke
Sonstiges (Delphi) - wie lang zum nächsten geburtstag ??
novabeat - Fr 27.12.02 19:35
Titel: wie lang zum nächsten geburtstag ??
Hallo !!!
Wie kann ich die tage bis zum nächsten geburtstag einer person bekommen, wenn ich das geburtsdatum habe ??
Christian S. - Fr 27.12.02 20:03
'DaySpan' oder 'DaysBetween' sollten Dir in Kombination mit 'now' helfen.
novabeat - Fr 27.12.02 23:04
nein, die befehele kennt mein D5 nicht !!!
hat denn keiner mal nen keinen auszug, mit dem das einfach geht ??
Wolff68 - Fr 27.12.02 23:24
Aber das TDateTime-Format gibt es doch in D5 schon.
TDateTime ist eine Realzahl.
Schau Dir mal das Format in der Hilfe an:
| Delphi-Hilfe hat folgendes geschrieben: |
| Bei den meisten VCL-Objekten werden Datums- und Zeitwerte mit dem Typ TDateTime repräsentiert. Der ganzzahlige Teil eines TDateTime-Wertes entspricht der Anzahl der Tage seit dem 30.12.1899. Der fraktionale Teil TDateTime-Wertes gibt die Tageszeit an. |
Also der ganzzahlige Teil (vor dem Komma) sind Tage.
Somit kannst einfach 2 TDateTime voneinander abziehen. Dann steht vor dem Komma die anzahl Tage dazwischen. Logisch?
Quelltext
1: 2: 3: 4: 5: 6:
| var nextGeb : TDate; DaysLeft : Integer; begin nextGeb := EncodeDate(2003, 5, 1); DaysLeft := Trunc(nextGeb - Now); end; |
ungetestet
PS: Über Datums-Berechnungen gibts hier übrigends haufenweise Beiträge.
novabeat - Sa 28.12.02 12:30
nee, also irgendwie klappt das nicht !!! da kommt bei mir immer ein negativer wert raus, der im 4 stelligen bereich liegt !!!
ich hab auch schon probiert, den geburtsatag von now abzuzihehen, aber da kommt immer ein datum raus, das mir gar nix bringt.
ich will einfach die anzahl der tage, wie lang es dauert, bis das dateum (der geburtstag) wieder kommt.
georgfischerx - Sa 28.12.02 13:38
Titel: Datumsberechnungen ...!
Bist Du auch ganz sicher, dass die Variablen richtig DEKLARIERT sind? Typen wie Integer und Word sind sehr begrenzt im Werteumfang, da passiert es schon mal, dass der Bereich überschritten ist (Integer > 32768) und daher ein negativer Wert rauskommt.
Wenn Du LongInt oder noch grössere Typen verwendest, müsste es klappen, auch wenn es seit dem Jahr 1899 schon über 100 Jahre her ist ( > 32000 Tage)
Gruss, Georg
P.S. Welche Delphi-Version verwendest Du denn? Je nachdem sind andere Wertebereiche vorhanden ...
novabeat - Sa 28.12.02 16:00
also ich verwende D5 !!!
aber der code vom Wolff zieht ja nur das gebutrsdatum vom aktuellen datumswert ab. das heisst ich bekomm doch die tage seit senem geburtstag sprich: sein alter.
das will ich aber nicht. ich will die tage bis zum nächsten geburtstag !!
BSP: wenn heute der 28.12.2002 ist un der typ am 30.12.2002 seinen 40 geburtstag hat, will ich 2 rausbekommen, weil er in 2 tagen geburtstag hat !! und wenn es der 31.12.2002 ist müsste also 364 tage rauskommen !!
Wolff68 - Sa 28.12.02 18:55
| novabeat hat folgendes geschrieben: |
| aber der code vom Wolff zieht ja nur das geburtsdatum vom aktuellen datumswert ab. das heisst ich bekomm doch die tage seit senem geburtstag sprich: sein alter. |
Deshalb heist die Varable auch schon NextGeb (von
NÄCHSTER Geburtstag) und deshalb hab ich auch bei EncodeDate
2003 ! drin stehen.
Natürlich musst Du hier den nächsten Geburtstag einsetzen. Nicht den eigentlichen, der logischerweise Jahre her ist.
Das erklärt auch, warum Du negative Werte bekommst.
Niemand hat behauptet, daß diese paar Zeilen Code die komplette Funktion seien. Ich geh hier eigentlich davon aus, daß die Leute KEINE Fertiglösung, sondern einen Tip in die richtige Richtung benötigen...
Also bitte nicht heulen, sondern verstehen, weiterdenken und selber umsetzen.
| georgfischerx hat folgendes geschrieben: |
| Typen wie Integer und Word sind sehr begrenzt im Werte-umfang |
Klar. Ein Jahr ist aber auch recht begrenzt in der Anzahl Tage.
Es sollten ja die Tage bis zum nächsten Geburtstag erscheinen. Somit nie größer als 365. (siehe oben)
Hier mal ein komplettes Beispiel (getestet) mit 3 SpinEdits, einem Button und 1 Label: (Und bitte das Jahr im SpinEdit3 4-Stellig eingeben)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure TForm1.Button1Click(Sender: TObject); var nextGeb : TDate; // Datum des NÄCHSTEN Geburtstages Day, Month, Year, // Zwischenwerte DaysLeft, // Tage bis zum Geburtstag Alter : Word; // Alter begin { Werte aus Eingabefeldern holen } Day := SpinEdit1.Value; Month := SpinEdit2.Value;
{ NextGeb auf Tag und Monat im momentanen Jahr setzen } { CurrentYear liefert das Jahr der aktuellen Systemzeit (4-Stellig)} nextGeb := EncodeDate(CurrentYear, Month, Day);
{ Wenn Geburtstag dieses Jahr schon rum, den im nächsten Jahr nehmen } { Date liefert das Aktuelle Systemdatum ohne Zeit } IF Date > nextGeb then nextGeb := EncodeDate(CurrentYear+1, Month, Day);
{ Tage zwischen nächstem Geburtstag und Heute berechnen } DaysLeft := Trunc(nextGeb - Date);
{ Alter bei nächstem Geburtstag bestimmen } { Um ohne Unit DateUtils an das Jahr zu kommen, } { muß NextGeb komplett dekodiert werden } DecodeDate(NextGeb, Year, Month, Day); Alter := Year - SpinEdit3.Value;
{ In Label1 ausgeben } Label1.Caption := 'Der Kantidat wird in ' +IntToStr(DaysLeft)+' Tagen ' +IntToStr(Alter)+' Jahre alt!'; end; |
novabeat - Sa 28.12.02 20:51
super danke !!!
leider kennt D5 CurrentYear nicht, aber das prob habe ich selber schon gelößt !!
Wolff68 - So 29.12.02 00:05
Oh. Da lass ich extra die Tools aus der Unit DateUtils wech, weil ich dachte, daß DIESE Funktionen unter D5 vielleicht nicht vorhanden sind...
Hab eben D6 und keine Ahnung was in D5 alles nicht drin ist.
Aber nach DecodeDate(Date, Year, Month, Day) hast ja auch das aktuelle Jahr in Year gespreichert. :)
novabeat - So 29.12.02 10:19
ähm ja... ich hab zwar NOW mal decoded aber das geht genauso !!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!