Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kalenderwochen Funktion Falsch? (https://www.delphipraxis.net/104498-kalenderwochen-funktion-falsch.html)

Eppos 5. Dez 2007 12:48


Kalenderwochen Funktion Falsch?
 
Hallo zusammen,

ich benutze hier aus der Code-Lib folgende Funktion:

Hier zeigt Alex_ITA01 wie es möglich ist, anhand eines Datums die zugehörige Kalenderwoche zu ermitteln. Für Delphi 6 und höher, geht dies genau so gut mit WeekOfTheYear (Unit: DateUtils), doch für die Benutzer älterer Delphi-Versionen ist dies mit folgendem Code möglich:

Delphi-Quellcode:
function GetKW(Date: TDateTime): Integer;
var
   Day: Integer;
   Y, M, D: Word;
begin
  Day := DayOfWeek(Date) - 1;
  if (Day <= 0) then
    Day := 7;
  DecodeDate(Date + 4 - Day, Y, M, D);

  result := round(((Date + 8 - Day) - EncodeDate(Y, 1, 1)) / 7);
end;
Wenn ich aber diese verwende, wird mir die Kalenderwoche für den 10.01.2008 falsch berechnet?!
@Edit: Bekomme als Ergebnis '1', sollte aber 2 ausspucken...

Hat jemand eine Idee warum das so ist?

Ich habe die WeekOfTheYear Funktion nicht zur Verfügung!

Danke

DP-Maintenance 5. Dez 2007 12:50

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage

Eppos 5. Dez 2007 12:58

Re: Kalenderwochen Funktion Falsch?
 
... ausser man beachtet, dass es sich um eine Deutsche KW/Datum handelt.

negaH 5. Dez 2007 16:46

Re: Kalenderwochen Funktion Falsch?
 
Also ich habe damals, und das schon zu Delphi 2 Zeiten, exakt diese Funktion entwickelt. Sie funktioniert richtig, teste mal

Delphi-Quellcode:
  ShowMessage(IntToStr(WeekOfDate(EncodeDate(2008, 1, 10))));
bei mir kommt da wie erwartet 2 raus.

Gruß Hagen

x000x 6. Jan 2010 09:33

Re: Kalenderwochen Funktion Falsch?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin moin,

mir ist gestern aufgefallen, dass diese funktion wohl doch fehlerhaft ist.
Das Problem liegt wohl hier:
Delphi-Quellcode:
((Date + 8 - Day) - EncodeDate(Y, 1, 1)) / 7
Folgender aufruf zeigt den Fehler:
Delphi-Quellcode:
ShowMessage(IntToStr(WeekOfDate(StrToDateTime('06.01.2010 11:59:59')))+#13#10+
            IntToStr(WeekOfDate(StrToDateTime('06.01.2010 12:00:00'))));

Mithrandir 6. Jan 2010 09:47

Re: Kalenderwochen Funktion Falsch?
 
Moin Peter,

stimmt, die Funktion ist nicht richtig. Hagens Funktion hingegen arbeitet tadellos. ;)

x000x 6. Jan 2010 09:51

Re: Kalenderwochen Funktion Falsch?
 
Delphi-Quellcode:
function DayOfWeekGerman(ADate: TDateTime): Integer;
begin
  Result := DayOfWeek(ADate) -1;
  if Result <= 0 then Result := 7;
end;

function WeekOfDate(A: TDateTime): Integer;
var
  Day: Integer;
  Y,M,D: Word;
begin
  Day := DayOfWeekGerman(A);
  DecodeDate(A +4 -Day, Y, M, D);
  Result := Round(((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7);
end;

procedure TForm1.Button1Click(Sender: TObject);
var dat : TDateTime;
begin
  ShowMessage(IntToStr(WeekOfDate(StrToDateTime('06.01.2010 11:59:59')))+#13#10+
              IntToStr(WeekOfDate(StrToDateTime('06.01.2010 12:00:00'))));
end;
ich komme hierbei leider zum selben ergebnis :-/

Schreibt man den Wert von
Delphi-Quellcode:
((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7
in einen double, dann sieht man auch warum.

Bei '06.01.2010 11:59:59' ergibt dann
Delphi-Quellcode:
((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7 = 1.4999983466
Bei '06.01.2010 12:00:00' ergibt dann
Delphi-Quellcode:
((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7 = 1.5
und da
Delphi-Quellcode:
Round(1.5) = 2
entsteht der Fehler.

Mithrandir 6. Jan 2010 10:06

Re: Kalenderwochen Funktion Falsch?
 
Dann sollte der Nachkommateil vielleicht lieber weggefiltert werden. :gruebel: Statt Delphi-Referenz durchsuchenRound also Delphi-Referenz durchsuchenTrunc

Amateurprofi 6. Jan 2010 21:44

Re: Kalenderwochen Funktion Falsch?
 
Zitat:

Zitat von Daniel G
Dann sollte der Nachkommateil vielleicht lieber weggefiltert werden. :gruebel: Statt Delphi-Referenz durchsuchenRound also Delphi-Referenz durchsuchenTrunc

Nein, das bringt nichts.
Hagens Routine arbeitet fehlerfrei, solange der TDateTime Wert ganzzahlig ist.
Wenn der TDateTime-Wert einen Zeitanteil hat, bringt sie an bestimmten Tagen dann fehlerhafte Resultate, wenn der Zeitanteil >= 12 Stunden ist.
Also sollte am Anfang der Routine eine Zeile
Delphi-Quellcode:
A := Int(A);
eingefügt werden.

Vielleicht sollte man die letzte Zeile ändern
von
Delphi-Quellcode:
Result := Round(((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7);
in
Delphi-Quellcode:
Result := Trunc(0.5+((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7);
weil das besser zeigt, was gerechnet werden soll.
M.E. sollte die Routine dann so aussehen:
Delphi-Quellcode:
function DayOfWeekGerman(ADate: TDateTime): Integer;
begin
  Result := DayOfWeek(ADate) -1;
  if Result <= 0 then Result := 7;
end;

function WeekOfDate(A: TDateTime): Integer;
var
  Day: Integer;
  Y,M,D: Word;
  n:extended;
begin
  A := Int(A);
  Day := DayOfWeekGerman(A);
  DecodeDate(A +4 -Day, Y, M, D);
  Result := Trunc(0.5+((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7);
end;

Mithrandir 7. Jan 2010 08:11

Re: Kalenderwochen Funktion Falsch?
 
Zitat:

Zitat von Amateurprofi
Nein, das bringt nichts.

Und im selben Posting machst du es dann doch. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 Uhr.
Seite 1 von 3  1 23      

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