Announcement

Collapse
No announcement yet.

Kalenderwoche in Datum und umgekehrt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kalenderwoche in Datum und umgekehrt

    Hallo,<br>
    wer hat eine Routine parat oder weiss, wie man<br>
    - aus einer <b>Kalenderwoche+Jahr</b> das Anfangs- und Enddatum einer Woche<br>
    - aus einem <b>Datum</b> die Kalenderwoche<br>
    bestimmen kann ?<br>
    Vielen Dank für Euere Tips<br>
    Hermann

  • #2
    Hallo,

    die folgende Funktion sollte die Woche für ein bestimmtes Datum ermitteln:
    <pre>
    FUNCTION Week(Date : TDateTime) : INTEGER;
    VAR
    Y, M, D, { Jahr, Monat, Tag }
    FDay : WORD; { Wochentag des 1. Januar im Jahr }
    JanF : TDateTime; { 1. Januar des Jahres }
    Days : INTEGER; { Anzahl Tage seit dem 1. Januar des Jahres }
    BEGIN
    TRY
    DecodeDate(Date, Y, M, D);
    JanF := EncodeDate(Y, 1, 1);
    FDay := DayOfWeek(JanF);
    Days := Trunc(Int(Date)-JanF)+7-DayOfWeek(Date-1);
    Inc(Days, 7 * Ord(FDay IN [2..5]));
    Result := Days DIV 7;
    IF Result = 0 THEN BEGIN
    IF (DayOfWeek(EncodeDate(Y-1, 1, 1)) > 5) OR
    (DayOfWeek(EncodeDate(Y-1, 12, 31)) < 5) THEN
    Result := 52
    ELSE
    Result := 53;
    END ELSE IF Result = 53 THEN BEGIN
    IF (FDay > 5) OR
    (DayOfWeek(EncodeDate(Y, 12, 31)) < 5) THEN
    Result := 1;
    END;
    EXCEPT
    Result := 0;
    END;
    END;
    </pre>

    P.S: Die Funktion stammt aus meiner Sammlung von noch ungetesteten Funktionen

    Comment


    • #3
      <p>Hallo Hermann,<br>
      <br>
      mit folgender Funktion kannst Du die Kalenderwoche ermitteln. Sie stammt von Hagen Reddmann:<br>
      <br>
      <pre>
      function WeekOfDate(aDatum:TDateTime): Integer;
      var Day :Integer;
      Y, M, D:Word;
      begin
      Day:=DayOfWeek(aDatum)-1;
      if (Day<=0) then Day:=7;
      DecodeDate(aDatum+4-Day, Y, M, D);
      Result:=Round(((aDatum+8-Day)-EncodeDate(Y, 1, 1))/7);
      end; // WeekOfDate
      </pre>
      <br>
      Die Ermittlung des Datums aus einer Kalenderwoche erledigt folgende Funktion:<br>
      <br>
      <pre>
      function KWStart_Datum(const aDatum:TDateTime):TDateTime;
      var aKW:Integer;
      begin
      aKW:=WeekOfDate(aDatum);
      Result:=aDatum-7.0;
      while not (WeekOfDate(Result)=aKW) do result:=result+1.0;
      end; // KWStart_Datum
      </pre>
      <br>
      Das Ende der Woche erhälst Du, fogendermaßen:<br>
      <br>
      <pre>
      procedure TForm1.BtnClick(Sender:TObject);
      var start,
      ende,
      aDatum:TDateTime;
      aKW :Integer;
      begin
      aDatum:=EncodeDate(2000, 4, 4);
      // Kalenderwoche
      aKW:=WeekOfDate(aDatum);
      // Anfangsdatum der Woche
      start:=KWStart_Datum(aDatum);
      // Enddatum der Woche
      ende:=start+6.0;
      end; // TForm1.BtnClick
      </pre>
      <br>
      Gruß Thomas</p&gt

      Comment


      • #4
        Hallo Thomas,<br>
        wo kann ich denn hier die Kalenderwoche übergeben ?<br>
        Ich wollte eigentlich eine KW übergeben und das Datum des ersten Tages der Woche erhalten. Habt Ihr vielleicht noch eine kleine Funktion in Reserve ?
        (Aber trotzdem vielen Dank für die Anregungen).

        <pre>
        Die Ermittlung des Datums aus einer Kalenderwoche erledigt folgende Funktion:
        function KWStart_Datum(const aDatum:TDateTime):TDateTime;
        var aKW:Integer;
        begin
        aKW:=WeekOfDate(aDatum);
        Result:=aDatum-7.0;
        while not (WeekOfDate(Result)=aKW) do result:=result+1.0;
        end; // KWStart_Datum
        </pre>
        <P>
        Viele Grüsse<BR>
        Herman

        Comment


        • #5
          <p>Hallo Hermann,<br>
          <br>
          hier kommt die kleine Reserve:<br>
          <br>
          <pre>
          function KW_Start(aKW, aJahr:Integer):TDatumMJD;
          begin
          Result:=EncodeDate(aJahr, 1, 1)+(aKW-1)*7.0;
          while not (WeekOfDate(Result)=aKW) do Result:=Result+1.0;
          end; // KW_Start
          </pre>
          <br>
          Gruß Thomas</p&gt

          Comment


          • #6
            <p>Hallo Hermann,<br>
            <br>
            hier kommt die kleine Reserve:<br>
            <br>
            <pre>
            function KW_Start(aKW, aJahr:Integer):TDateTime;
            begin
            Result:=EncodeDate(aJahr, 1, 1)+(aKW-1)*7.0;
            while not (WeekOfDate(Result)=aKW) do Result:=Result+1.0;
            end; // KW_Start
            </pre>
            <br>
            Gruß Thomas</p&gt

            Comment


            • #7
              Hallo Thomas,<br>
              Deine Funktion KW_Start(aKW, aJahr:Integer):TDateTime hat noch einen kleinen Bug. Sie funktioniert nicht richtig, wenn die KW53, die ja nicht so oft auftritt, den Jahreswechsel überschreitet (z.B. KW53 / 2004). Hier die verbesserte Variante, die auch KW's > 53 abfängt:
              <pre>

              function KW_Start(aKW, aJahr:Integer):TDateTime;
              var Tag, Monat, Jahr : word;
              ErrMsg : string;
              StartKW : integer;
              begin
              ErrMsg := 'Ungültige Woche für Jahr '+IntToStr(aJahr)+'.';
              if aKW > 53 then
              raise Exy_ERROR.Create(ErrMsg);

              if aKW = 53 then
              StartKW := aKW - 2
              else
              StartKW := aKW - 1;

              Result:=EncodeDate(aJahr, 1, 1)+(StartKW)*7.0;
              while not (WeekOfDate(Result)=aKW) do Result:=Result+1.0;
              DecodeDate(Result, Jahr, Monat, Tag);
              if Jahr <> aJahr then
              raise Exy_ERROR.Create(ErrMsg);
              end;

              </pre>
              viele Grüsse<BR>
              Herman

              Comment


              • #8
                Hi

                <pre>
                function DateOfWeek(Year, Week: Word): TDateTime;
                begin
                Result := EncodeDate(Year, 1, 1);
                Result := Result - (DayOfWeek(Result -2) +3) mod 7 +3 + (Week -1) * 7;
                end;
                </pre>

                Berechnet das datum der Woche im Jahr. Dabei wird auf den Montag positioniert.

                WeekOfDate() hat ja Thomas schon gepostet.

                Gruß Hage

                Comment

                Working...
                X