AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kalenderwochen Funktion Falsch?

Ein Thema von Eppos · begonnen am 5. Dez 2007 · letzter Beitrag vom 8. Jan 2010
Antwort Antwort
Seite 1 von 3  1 23      
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#1

Kalenderwochen Funktion Falsch?

  Alt 5. Dez 2007, 12:48
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
  Mit Zitat antworten Zitat
5. Dez 2007, 12:50
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Kalenderwochen Funktion Falsch?

  Alt 5. Dez 2007, 12:58
... ausser man beachtet, dass es sich um eine Deutsche KW/Datum handelt.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Kalenderwochen Funktion Falsch?

  Alt 5. Dez 2007, 16:46
Also ich habe damals, und das schon zu Delphi 2 Zeiten, exakt diese Funktion entwickelt. Sie funktioniert richtig, teste mal

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

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Kalenderwochen Funktion Falsch?

  Alt 6. Jan 2010, 09:33
Moin moin,

mir ist gestern aufgefallen, dass diese funktion wohl doch fehlerhaft ist.
Das Problem liegt wohl hier:
((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'))));
Miniaturansicht angehängter Grafiken
kw_285.png  
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#6

Re: Kalenderwochen Funktion Falsch?

  Alt 6. Jan 2010, 09:47
Moin Peter,

stimmt, die Funktion ist nicht richtig. Hagens Funktion hingegen arbeitet tadellos.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Kalenderwochen Funktion Falsch?

  Alt 6. Jan 2010, 09:51
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 ((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 ((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7 = 1.4999983466 Bei '06.01.2010 12:00:00' ergibt dann ((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7 = 1.5 und da Round(1.5) = 2 entsteht der Fehler.
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#8

Re: Kalenderwochen Funktion Falsch?

  Alt 6. Jan 2010, 10:06
Dann sollte der Nachkommateil vielleicht lieber weggefiltert werden. Statt Delphi-Referenz durchsuchenRound also Delphi-Referenz durchsuchenTrunc
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Kalenderwochen Funktion Falsch?

  Alt 6. Jan 2010, 21:44
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
A := Int(A); eingefügt werden.

Vielleicht sollte man die letzte Zeile ändern
von
Result := Round(((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7); in
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#10

Re: Kalenderwochen Funktion Falsch?

  Alt 7. Jan 2010, 08:11
Zitat von Amateurprofi:
Nein, das bringt nichts.
Und im selben Posting machst du es dann doch.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 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