![]() |
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:
Wenn ich aber diese verwende, wird mir die Kalenderwoche für den 10.01.2008 falsch berechnet?!
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; @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
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage |
Re: Kalenderwochen Funktion Falsch?
... ausser man beachtet, dass es sich um eine Deutsche KW/Datum handelt.
|
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:
bei mir kommt da wie erwartet 2 raus.
ShowMessage(IntToStr(WeekOfDate(EncodeDate(2008, 1, 10))));
Gruß Hagen |
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:
Folgender aufruf zeigt den Fehler:
((Date + 8 - Day) - EncodeDate(Y, 1, 1)) / 7
Delphi-Quellcode:
ShowMessage(IntToStr(WeekOfDate(StrToDateTime('06.01.2010 11:59:59')))+#13#10+
IntToStr(WeekOfDate(StrToDateTime('06.01.2010 12:00:00')))); |
Re: Kalenderwochen Funktion Falsch?
|
Re: Kalenderwochen Funktion Falsch?
Delphi-Quellcode:
ich komme hierbei leider zum selben ergebnis :-/
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; Schreibt man den Wert von
Delphi-Quellcode:
in einen double, dann sieht man auch warum.
((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7
Bei '06.01.2010 11:59:59' ergibt dann
Delphi-Quellcode:
Bei '06.01.2010 12:00:00' ergibt dann
((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7 = 1.4999983466
Delphi-Quellcode:
und da
((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7 = 1.5
Delphi-Quellcode:
entsteht der Fehler.
Round(1.5) = 2
|
Re: Kalenderwochen Funktion Falsch?
|
Re: Kalenderwochen Funktion Falsch?
Zitat:
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:
eingefügt werden.
A := Int(A);
Vielleicht sollte man die letzte Zeile ändern von
Delphi-Quellcode:
in
Result := Round(((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7);
Delphi-Quellcode:
weil das besser zeigt, was gerechnet werden soll.
Result := Trunc(0.5+((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7);
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; |
Re: Kalenderwochen Funktion Falsch?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 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