![]() |
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:
z.B. wenns auf Februar hingeht (also z.B. eingabe werte 2005, 3, -5) wirft EncodeDate Exceptions, weil komische Werte generiert werden...
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; hat jemand bereits so eine Funktion oder kann meine korrigieren? |
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:
und erhalte:
procedure TForm1.Button1Click(Sender: TObject);
begin ShowMessage(DateTimeToStr(EncodeDateTime0Based(2005, 3, -5))); end; Zitat:
|
Re: EncodeDateTime mit Werten <1?
Ich glaube aber nicht, dass das das gewünschte Ergebnis ist...
|
Re: EncodeDateTime mit Werten <1?
Ich denke, das Problem liegt in der Zeile von:
Delphi-Quellcode:
Ich hab AMonth = 2 gemacht und da passiert es, dass die Function "DaysInAMonth" als Montag die 0 erhält (laut Debugger).
ADay := DaysInAMonth(AYear, AMonth-1) + ADay;
Dann ist ADay über 49000 und EncodeDate weiss nimmer was zu tun ist. |
Re: EncodeDateTime mit Werten <1?
Zitat:
[add]Wobei Year natürlich schlecht 0-basiert sein kann bzw. schon ist, also würde ich dort das + 1 weglassen. [/add] |
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:
Wäre doch das Selbe Ergebnis ... oder? -hm-
Date := EncodeDate(2005, 3, 1);
Date := Date - 5; Edit: EncodeDate statt EncodeDateTime... |
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 04:20 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