Einzelnen Beitrag anzeigen

Benutzerbild von kwhk
kwhk

Registriert seit: 25. Mär 2009
Ort: Dresden
168 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Kalenderwoche ermitteln

  Alt 30. Mai 2013, 17:29
Delphi-Quellcode:
var
         dt : TDateTime;
begin
   dt := StrToDate('01.01.') + StrToInt(edYear.Text)
       + (StrToInt(edCW1.Text) + StrToInt(edWochen.Text)) * 7;
   edCW2.Text := IntToStr(WeekOfTheYear(dt));
   edYear.Text := IntToStr(YearOf(dt));
end;
Ich habe das mal getestet jedoch zuvor ein bisschen geändert

Delphi-Quellcode:
var
         dt : TDateTime;
begin
   dt := StrToDate('01.01.'+edYear.Text)) // <== Hier wurde Str und Int addiert, gemeint was '01.01.JJJJ'
       + (StrToInt(edCW1.Text) + StrToInt(edWochen.Text)) * 7;
   Label6.Caption := 'Datum = '+DateToStr(dt);
// edCW2 := IntToStr(WeekOfTheYear(dt));
// edYear := IntToStr(YearOf(dt));end;
Wenn z.B. Woche 52/2013 + 1 Woche, dann wird als Datum der 07.01.2014 ermittelt, und das ist die Woche 02/2014, richtig wäre jedoch Woche 01/2014.
Die Ursache ist, wie von mir oben genannt, man kann nicht einfach den 01.01. als Startdatum nehmen (das war 2013 ein Dienstag) sondern, wenn man es so macht, den Montag der Woche 01/2013, das war der 31.12.2012 - und das muss man etwas aufwendiger im Vorfeld ermitteln.
In der Anweisung dt:= werden zum 01.01.2013 (52+1)*7 = 371 Tage dazugezählt. Das ergibt den 372. Tag 2013, die Funktion DateToStr ermittelt daraus den 07.01.2014, das ist richtig, wenn man 365 abzieht und beim Jahr 1 dazuzählt.
Die Woche 52/2013 geht vom 23.12.-29.12.2013, die Woche+1 vom 30.12.2013-05.01.2014.
Der ermittelte Tag 07.01.2014 stimmt in keine Weise.
Die beiden letzten Anweisungen musste ich deaktivieren, weil mein D7 die Funktionen nicht übersetzen kann.

Übrigens auch das ganz oben genannte Aufgabenbeispiel : Woche 12/2013 + 5 Wochen => 17/2013
ergibt das Datum 30.04.2013, und das liegt in der Woche 18/2013

Man käme wahrscheinlich etwas besser, wenn man
statt (StrToInt(edCW1.Text) + StrToInt(edWochen.Text)) * 7
besser (StrToInt(edCW1.Text) -1 + StrToInt(edWochen.Text)) * 7
benutzt.
z.B. Woche 1 + 1 Woche im alten Verfahren (1+1)*7 = 14 Tage + 01.01. = 15.01.
Der 15.01 liegt immer in Woche 3, richtig wäre aber Woche 2.
Hartmut

Geändert von kwhk (30. Mai 2013 um 18:42 Uhr)
  Mit Zitat antworten Zitat