Autor Beitrag
novabeat
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: Fr 27.12.02 18:35 
Hallo !!!

Wie kann ich die tage bis zum nächsten geburtstag einer person bekommen, wenn ich das geburtsdatum habe ??
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 27.12.02 19:03 
'DaySpan' oder 'DaysBetween' sollten Dir in Kombination mit 'now' helfen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
novabeat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: Fr 27.12.02 22:04 
nein, die befehele kennt mein D5 nicht !!!

hat denn keiner mal nen keinen auszug, mit dem das einfach geht ??
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Fr 27.12.02 22: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?
ausblenden 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.

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."

Für diesen Beitrag haben gedankt: Jakane
novabeat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: Sa 28.12.02 11: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 37



BeitragVerfasst: Sa 28.12.02 12: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: Sa 28.12.02 15: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Sa 28.12.02 17: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)
ausblenden volle Höhe 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;

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
novabeat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: Sa 28.12.02 19:51 
super danke !!!

leider kennt D5 CurrentYear nicht, aber das prob habe ich selber schon gelößt !!
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Sa 28.12.02 23: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. :)

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
novabeat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 20



BeitragVerfasst: So 29.12.02 09:19 
ähm ja... ich hab zwar NOW mal decoded aber das geht genauso !!!