Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Kalenderwoche ermitteln (https://www.delphipraxis.net/174977-kalenderwoche-ermitteln.html)

claudine99 22. Mai 2013 17:48

Kalenderwoche ermitteln
 
Hallo zusammen, ich benötige eine Funktion, die bei einem 'on change' Ereignis eines Editfeldes aufgerufen wird. Sie soll folgendes tun: Es gibt ein Editfeld mit einer Kalenderwoche und eines mit der Jahresangabe. Wird nun in ein 3. Editfeld eine Wochenanzahl eingegeben, soll in ein viertes Feld automatisch die 1. Kalenderwoche + der eingegebenen Wochenanzahl erscheinen. Ein 5. Feld beinhaltet das errechnete Jahr.

cw year Wochen cw year
12 2013 5 17 2013

oder

52 2013 6 6 2014

Hat jemand eine Idee?

Vielen Dank und Grüße

DeddyH 22. Mai 2013 18:17

AW: Kalenderwoche ermitteln
 
Da würde ich zuerst einen Blick in DateUtils.pas werfen.

madtom 22. Mai 2013 18:33

AW: Kalenderwoche ermitteln
 
Hallo,

zum Berechnen der Kalenderwoche wirst Du eine Menge Tipps in allen möglichen Code-Collections finden, u.a. hier:

http://www.s170867368.online.de/delphi/kw.php

Gruß Thomas

DeddyH 22. Mai 2013 18:40

AW: Kalenderwoche ermitteln
 
Oder in DateUtils (das hatten wir doch schon?).

Furtbichler 22. Mai 2013 19:21

AW: Kalenderwoche ermitteln
 
Gibts na nicht ne fertige Funktion in einer der Units, die bei Delphi dabei sind?

Wie hieß die doch gleich...

Verdammt, komm nich drauf, irgendwas mit ...Utils. tcpUtils.pas? Nee.

nahpets 22. Mai 2013 19:41

AW: Kalenderwoche ermitteln
 
Hallo,

eigentlich ist das doch "nur" ein bisserl Rechenarbeit. Eventuell hilft dasda ja:
Delphi-Quellcode:
procedure Wochenrechner;
var
        dt    : TDateTime;
        cw1    : Integer;
        Wochen : Integer;
        cw2    : Integer;
        Jahr  : Integer;
begin
  cw1         := StrToInt(edCW1.Text);   // im Beispiel 52
  cw1         := cw1 * 7;                // Ergibt die Anzahl Tage für 52 Wochen.
  dt         := StrToDate('01.01.') + StrToInt(edYear.Text); // im Beispiel 2013
  dt         := dt + cw1;               // Ist das Datum der 52. Woche.
  Wochen     := StrToInt(edWochen.Text); // im Beispiel 6
  Wochen     := Wochen * 7;             // Ergibt die Anzahl Tage für 6 Wochen.
  dt         := dt + Wochen;            // Zum Datum der 52 Wochen entsprechende Anzahl Tage hinzuzählen.
  cw2         := WeekOfTheYear(dt);      // Die Woche des errechneten Datums ermitteln.
  Jahr       := YearOf(dt);             // Das Jahr des errechneten Datums ermitteln.
  edCW2.Text := IntToStr(cw2);
  edYear.Text := IntToStr(Jahr);
end;
Ist ungetestet mal einfach so dahingedaddelt.

Oder ein bisserl kürzer:
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;
Latürnich auch nicht getestet.

kwhk 30. Mai 2013 12:49

AW: Kalenderwoche ermitteln
 
Ganz so einfach ist das nicht, schon deshalb nicht, weil der 01.01.jjjj nicht unbedingt der Beginn der Woche 1 des Jahres jjjj sein muss. 2014 beginnt die Woche 1 am 30.12.2013, zumindest in Deutschland, wenn man sich mal darauf reduziert.
Die Woche 1 in Deutschland ist die, die den ersten Donnerstag enthält. http://de.wikipedia.org/wiki/Woche
Die Woche 1 in den USA ist die, die den 1. Januar enthält.
Ist der 01.01. ein Fr,Sa,So, beginnt die Woche 1 in Deutschland am folgenden Montag.
Ist der 01.01. ein Mo,Di,Mi,Do, beginnt die Woche 1 in Deutschland in dieser Woche, auch wenn davon noch ein paar Tage zum alten Jahr gehören (siehe Kalender 2014)
Man muss also zunächst ermitteln, zu welchem Wochentag der 01.01. des Ausgangsjahres gehört und danach bestimmen, an welchem Tag die Woche 1 des Ausgangsjahres beginnt, das kann u.U. auch ein Tag des Vorjahres sein, z.B.30.12.2013 = 1. Tag der Woche 1 von 2014.
Die Anzahl Wochen kann man mit 7 (Tage pro Woche) multiplizieren und zum Datum des ersten Tages der Woche 1 addieren. Aus dem dabei entstehenden Datum (1. Tag der gesuchten Woche) muss nun ähnlich wie vorher die Woche ermittelt werden.
Dazu zunächst das Datum der ersten Tages der Woche 1 ermitteln und dann die Tagesdifferenz zwischen 1.Tag Woche 1 und berechnetem Datum / 7 ergibt die gewünschte Woche.
Auch hier aufpassen, wenn das ermittelte Datum z.B. der 31.12.2013 ist, dann ist das die Woche 1 des Jahres 2014 !
Das Jahr des Datums des Wochenbeginns muss nicht das Jahr der zugehörogen Woche sein.
Beispiel 30.12.2013 gehört zur Woche 01-2014

DeddyH 30. Mai 2013 13:46

AW: Kalenderwoche ermitteln
 
Ich weiß nicht, ob ich neuerdings in Geheimschrift tippe oder einfach ignoriert werde :gruebel:
Zitat:

System.DateUtils.WeekOfTheYear
...
AYear gibt das Jahr mit der angegebenen Woche zurück. Dieser Wert darf nicht mit dem Jahr in AValue identisch sein. Der Grund liegt darin, dass die erste Woche eines Jahres als erste Woche definiert ist, von der mindestens vier Tage in das betreffende Jahr fallen. Ist also der erste Kalendertag eines Jahres der Freitag, Samstag oder Sonntag, gibt WeekOfTheYear für die ersten drei oder zwei Tage oder für den ersten Tag des Kalenderjahres die Woche des vorhergehenden Jahres zurück. Entsprechendes gilt am Jahresende: Ist der letze Kalendertag eines Jahres ein Montag, Dienstag oder Mittwoch, gibt WeekOfTheYear für die letzten drei oder zwei Tage bzw. den letzten Tag des Kalenderjahres den Wert 1 (erste Woche des nächsten Kalenderjahres) zurück.

nahpets 30. Mai 2013 14:21

AW: Kalenderwoche ermitteln
 
@DeddyH
Zitat:

Zitat von DeddyH (Beitrag 1216981)
Ich weiß nicht, ob ich neuerdings in Geheimschrift tippe oder einfach ignoriert werde :gruebel:

Nö, Du wirst nicht ignoriert. In meinem Beispiel oben nutze ich die von Dir genannte Funktion, die intern das macht, was kwhk so schön in Worten beschreibt.

Also: Die Beachtung der Sonderregeln erfolgt durch die Nutzung der von Dir genannten Funktion.

Oder: Einfacher gehts nicht ;-)

kwhk 30. Mai 2013 16:29

AW: Kalenderwoche ermitteln
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 Uhr.
Seite 1 von 2  1 2      

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