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.