Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EncodeDateTime mit Werten <1? (https://www.delphipraxis.net/79437-encodedatetime-mit-werten-1-a.html)

DGL-luke 22. Okt 2006 17:38


EncodeDateTime mit Werten <1?
 
Hallo,

ich muss im Moment ein wenig mit Daten und Zeiten rumrechnen... und ich würe gerne auch mit negativen Tagen und Monaten rechnen. Habe dazu diese Funktion geschrieben:

Delphi-Quellcode:
function EncodeDateTime0Based(AYear, AMonth, ADay: Integer): TDate;
begin
  if AMonth < 0 then
  begin
    AYear := AYear + (AMonth div MonthsPerYear);
    AMonth := AMonth mod MonthsPerYear;
  end;
  if ADay < 0 then
  begin
    Dec(AMonth);
    while Abs(ADay) > DaysInAMonth(AYear,AMonth) do
    begin
      Dec(AMonth);
      Inc(ADay, DaysInAMonth(AYear, AMonth));
    end;
    ADay := DaysInAMonth(AYear, AMonth-1) + ADay;
  end;

  Result := EncodeDate(AYear+1,AMonth+1,ADay+1);
end;
z.B. wenns auf Februar hingeht (also z.B. eingabe werte 2005, 3, -5) wirft EncodeDate Exceptions, weil komische Werte generiert werden...
hat jemand bereits so eine Funktion oder kann meine korrigieren?

Helmi 22. Okt 2006 17:49

Re: EncodeDateTime mit Werten <1?
 
Hallo,

ich hab deine Function mal ausprobiert, aber ohne dass ich eine Exception erhalten habe.

Habs so aufgerufen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(DateTimeToStr(EncodeDateTime0Based(2005, 3, -5)));
end;
und erhalte:

Zitat:

---------------------------
Project1
---------------------------
27.03.2006
---------------------------
OK
---------------------------

3_of_8 22. Okt 2006 17:55

Re: EncodeDateTime mit Werten <1?
 
Ich glaube aber nicht, dass das das gewünschte Ergebnis ist...

Helmi 22. Okt 2006 18:04

Re: EncodeDateTime mit Werten <1?
 
Ich denke, das Problem liegt in der Zeile von:
Delphi-Quellcode:
    ADay := DaysInAMonth(AYear, AMonth-1) + ADay;
Ich hab AMonth = 2 gemacht und da passiert es, dass die Function "DaysInAMonth" als Montag die 0 erhält (laut Debugger).
Dann ist ADay über 49000 und EncodeDate weiss nimmer was zu tun ist.

Khabarakh 22. Okt 2006 18:07

Re: EncodeDateTime mit Werten <1?
 
Zitat:

Zitat von 3_of_8
Ich glaube aber nicht, dass das das gewünschte Ergebnis ist...

Stimmt doch :gruebel: ...?

[add]Wobei Year natürlich schlecht 0-basiert sein kann bzw. schon ist, also würde ich dort das + 1 weglassen. [/add]

SubData 22. Okt 2006 18:07

Re: EncodeDateTime mit Werten <1?
 
Gibs in der DateUtils nicht genug Funktionen, die das Manipulieren von Datumseingaben ermöglichen?
Ich glaube da sind auch Funktionen bei um Tage von einem Datum abzuziehen...

Obwohl...

Delphi-Quellcode:
    Date := EncodeDate(2005, 3, 1);
    Date := Date - 5;
Wäre doch das Selbe Ergebnis ... oder? -hm-


Edit: EncodeDate statt EncodeDateTime...

shmia 23. Okt 2006 16:29

Re: EncodeDateTime mit Werten <1?
 
Ich hab's mir mal ganz einfach gemacht:
Delphi-Quellcode:
function EncodeDateTime0Based(AYear, AMonth, ADay: Integer): TDate;
begin
  if AMonth < 0 then
  begin
    AYear := AYear + (AMonth div MonthsPerYear);
    AMonth := AMonth mod MonthsPerYear;
  end;
  Result := EncodeDate(AYear+1,AMonth+1, 1);
  // wir haben das Datum des 1. Tages im Monat
  // nun werden einfach die Tage addiert (ADay darf auch negativ sein)
  Result := Result + ADay;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 Uhr.

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