Einzelnen Beitrag anzeigen

Benutzerbild von kwhk
kwhk

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

AW: Kalenderwoche ermitteln

  Alt 30. Mai 2013, 19:12
Die Uses-Klausel an der richtigen Stelle habe ich bereits eingebaut (dank diesem Forum !).
Jetzt sieht es schon etwas besser aus, ist aber immer noch fehlerbehaftet, weil die Funktion YearOf(dt) zwar das richtige Jahr zum Datum liefert, dieses Jahr gehört aber nicht zur Woche.

Test: Woche 52/2013 + 1 Woche => ergibt als Datum den 30.12.2013 (ist ok) und als Woche 01 (auch ok) aber als Jahr 2013, das ist falsch, es muss ja die Woche 01/2014 sein. Es müsste also eine Funktion JAHR-ZUM-DATUM(dt) und JAHR-ZUR-WOCHE(dt) geben.
Evtl kann man das lösen, indem man abfragt, ob die Woche-Neu kleiner als die Woche-alt ist und in diesem Fall zum JAHR-NEU eine 1 dazu addieren, aber nur dann, wenn der Monat des Datums-Woche-neu eine 12 ist.

Das klappt aber auch nicht immer, z.B.
Test: Woche 52/2003 + 1 Woche = 31.12.2003 (ein Mittwoch), der 1.1.2004=Donnerstag, demnach beginnt Woche 1/2004.
Es wird statt 01/2004 das Ergebnis 01/2003 geliefert.
Also für das richtige Jahr zur Woche bei Jahreswechselüberschreitung muss man noch eine 100%ige Lösung finden.
Die vorhandenen Funktionen liefern das für Deutschland nicht.
In den USA, wo immer die Woche 1 mit dem 01.01. beginnt, stimmt das vielleicht.
Obwohl das Beispiel 2003/2004 zeigt, dass es nicht stimmt.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
   dt : TDateTime;
   iYear2,iWeek1,iWeek2,iMon2 : Integer;
begin
   iWeek1 := StrToInt(ComboBox1.Items[Combobox1.ItemIndex]);
   dt := StrToDate('01.01.' + ComboBox3.Items[Combobox3.ItemIndex]) //edYear.Text)
       + (iWeek1 -1 + StrToInt(ComboBox2.Items[Combobox2.ItemIndex])) * 7;
   iWeek2 := WeekOfTheYear(dt);
   iMon2 := MonthOfTheYear(dt);
   iYear2 := YearOf(dt);
   if iWeek2 < iWeek1 then
     if iMon2 = 12 then
       Inc(iYear2);
   Label6.Caption := 'Datum = '+DateToStr(dt);
   Label7.Caption := 'Woche = '+IntToStr(iWeek2)+'/'+IntToStr(iYear2);
end;
@DeddyH, ich habe Deine Version probiert, auch damit wird z.B. bei 52/2003 + 1 Wo = 01/2003 ermittelt, statt 1/2004 - also die gleiche Jahreswechselproblematik.
Hartmut

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