Announcement

Collapse
No announcement yet.

Datum

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datum

    MOIN

    Habe ein Problem und zwar:

    Habe ich eine Abfrage welches Datum heute ist und welches Geburtdatum ich habe.

    Bei einem Neustart dieses Programmes soll mir dann das Programmsagen wir mal 5 Tage vorher sagen das mein Geburstag ist.

    Mein Problem wie rechne ich rückwärts mit Monaten und Tagen den Beispiel

    21.11.1977 Geburtstag heut ist der 18.11.2002 so habe ein vorwarnzeit von 3

    Das heist er muesste heute eine Meldung geben das cih Geburtstag habe genausso am 2 und am 1 tag !

    das sit das erste

    Aber nun das eigendlcihe Problem

    Wenn die Vorwarnzeit 30 Tage betrifft gehe ich ja in den Vormat wie rechne ich das ?

    Danke für Eure hilfe
    Sebastian

  • #2
    <pre>

    var
    Y1,Y,M,D: Word;
    T: TDateTime;
    begin
    DecodeDate(Date, Y1, M, D); // dekodiere heutiges datum
    DecodeDate(GeburtsDatum, Y, M, D); // dekodiere Geburtsdatum
    T := EncodeDate(Y1, M, D); // nun auf aktuelles Jahr umrechnen
    Result := T - Date; // nun Tagesdifferenz
    end;

    </pre>

    Beachte aber das es Leute gibt die in einem Schaltjahr am 29.2. Geburtstag haben, und obiges EncodeDate(Y1, M, D); fehlschlagen könnte. Soll heissen obige Routine muß noch geschliffen werden.
    Das betrifft auch nur den 29.2. eines Schaltjahres, solche Kinder hätten ansonsten am 1.3. Geburtstag, glaub ich.<br>
    Wer's ganz genau wissen sollte kann es mir ja mal sagen

    Gruß hage

    Comment


    • #3
      DANKE das liest sich gut aber

      sorry bin absoluter Aanfänger

      Ich habe erstens eine Fehlermeldung "GeburtsDatum" NCIHT definiert
      und 2 undefinierter Bezeichner "Result"

      Was hab nich falsch gemacht

      Comment


      • #4
        Hallo Sebastian,<br>Geburtsdatum ist vom Typ TDateTime. D.h. irgendwo in deinem Programm muß die Variable Geburtsdatum deklariert sein. Eine andere Möglichkeit wäre, das Geburtsdatum ein Parameter der Funktion ist.<br>Jens Schuman

        Comment


        • #5
          die Funktion könnte so aussehen

          <pre>

          function DaysUptoBirthday(Birthday: TDateTime): Integer;
          var
          Y1,Y,M,D: Word;
          T: TDateTime;
          begin
          DecodeDate(Date, Y1, M, D); // dekodiere heutiges datum
          DecodeDate(BirthDay, Y, M, D); // dekodiere Geburtsdatum
          T := EncodeDate(Y1, M, D); // nun auf aktuelles Jahr umrechnen
          Result := Round(T - Date); // nun Tagesdifferenz
          end; <br>

          function SecondsUptoBirthday(Birthday: TDateTime): Integer;
          var
          Y1,Y,M,D: Word;
          T: TDateTime;
          begin
          DecodeDate(Date, Y1, M, D); // dekodiere heutiges datum
          DecodeDate(Birthday, Y, M, D); // dekodiere Geburtsdatum
          T := EncodeDate(Y1, M, D); // nun auf aktuelles Jahr umrechnen
          Result := Round((T - Now) * 24 * 60 * 60); // nun Sekundendifferenz
          end;

          </pre>

          Hage

          Comment


          • #6
            MOIN

            Danke das hab ich jetzt verstanden :-)

            Das funzt auch aber habe immer ncoh schwirigkeiten
            damit die Vorwarnzeit funzt Ich möchte ja zb das schon 6 tage VOR dem 11.12 ich eine Meldung bekomme aber auch am 5 4 3 2 1 0 Tag vorher!

            Genauso ist das Problem ja was mache ich wenn ich eine Vorwarnzeit von 30 Tagen haben zu dem 11.12 ?? da geht ja in den 11 Monat rein!

            DANKE für Eure nochmalige hilfe !

            Das ganze soll für ein Geburtstags Manager sein!

            CU Sebastia

            Comment


            • #7
              hi Sebastian

              vielleicht haben wir dein problem nicht verstanden. ansonsten nimmst du die funktion von hagen und vergleichst sie einem wert.

              <PRE>
              function Tform1.Meldung(Geburtstag: TDateTime; AnzahlTage: Integer): boolean
              begin
              result := false;
              if DaysUptoBirthday(Geburstag) <= AnzahlTage then result = true;
              end;
              </PRE

              gruß
              bernhar

              Comment


              • #8
                @Sebastian, Du möchtest immer einen positive Offset zurückgegeben bekommen, richtig ? Angenommen Geburtsdatum ist 3.5., am 1.5. sollte 2, am 3.5. sollte 0 und am 5.5. sollte 363 anstatt -2 zurückgegeben werden. Nachfolgender Code sollte Dein Problem lösen, testen musste ihn selber. Nach einer Umfrage unter meinen Kollegen habe wir uns darauf geeinigt das der geburtstag 29.2. in den Nicht-Schaltjahren am 1.3. gefeiert wird.

                <pre>

                var
                Y1,M1,D1,Y2,M2,D2: Word;
                begin
                DecodeDate(GeburtsDatum, Y1, M1, D1);
                DecodeDate(Date, Y2, M2, D2);<br>

                // überprüfe Monat und Tag, so das er immer in der Zukunft liegt
                if M1 < M2 then Inc(Y2) else
                if M1 = M2 then
                if D1 = D2 then
                begin
                Result := 0; // heute = geburtstag
                Exit;
                end else
                if D1 < D2 then Inc(Y2);<br>

                // überprüfe den Spezialfall Geburtsdatum = 29.2. und setze auf 1.3.
                if (M1 = 2) and (D1 = 29) and not IsLeapYear(Y2) then
                begin
                M1 := 3;
                D1 := 1;
                end;<br>

                Result := EncodeDate(Y2, M1, D1) - Date;
                end;

                </pre>

                Hage

                Comment


                • #9
                  Hier eine andere Version:
                  <pre>
                  function TForm1.GebWarnung(Geburtsdatum:TDateTime):Integer;
                  var
                  Y1,M1,D1,Y2,M2,D2: Word;
                  GebDate: TDateTime;
                  begin
                  DecodeDate(GeburtsDatum, Y1, M1, D1);
                  DecodeDate(Date, Y2, M2, D2);
                  {Jetzt transportieren wir das Datum auf dieses Jahr}
                  if (D1 = 29) and (M1 = 2) and (not (isLeapYear(Y2))) then begin
                  D1 := 1;
                  M1 := 3;
                  end else GebDate := EncodeDate(Y2,M1,D1);
                  result := trunc(GebDate) - trunc(Date);
                  end;

                  procedure TForm1.Button2Click(Sender: TObject);
                  begin
                  Label1.caption := IntToStr(GebWarnung(StrToDateTime('19.12.1949')));
                  end;
                  end.
                  </pre>
                  mfg Klaus-Pete

                  Comment


                  • #10
                    GebDate ist undefiniert falls die if then Abfrage zutrifft.
                    Desweiteren können negative Differenzen auftretten, z.b. heute ist der 24.12.2001 und wir suchen die Tagesanzahl bis zum Geburtstag 2.1.

                    Hage

                    Comment

                    Working...
                    X