Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi GetStartOfFirstWeekInYearISO8601 (https://www.delphipraxis.net/72951-getstartoffirstweekinyeariso8601.html)

PeterPanino 10. Jul 2006 01:08


GetStartOfFirstWeekInYearISO8601
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eine Routine gesucht, die mir das Datum des Beginns der ersten Woche in einem Jahr liefert (nach ISO 8601). Da ich keine gefunden habe, habe ich mir selber eine geschrieben:

Delphi-Quellcode:
function GetStartOfFirstWeekInYearISO8601(const Y: integer): TDate;
var
  i, W: integer;
  TestDatum: TDate;
const
  p: integer = 3;
begin
  for i := 1 to 7 do
  begin
    TestDatum := EncodeDate(Y, 1, i);
    W := WeekOfTheYear(TestDatum - p);
    if W = 1 then
    begin
      Result := TestDatum - p;
      BREAK;
    end;
  end;
end;
Gibt es eine einfachere Methode, um zu diesem Ergebnis zu kommen?
Ein kleines Testprogramm habe ich angehängt.

Hobby-Programmierer 10. Jul 2006 05:57

Re: GetStartOfFirstWeekInYearISO8601
 
Moin, moin :)
Also wenn ich das noch richtig im Kopf habe, gilt folgende Regel:
der 4 Januar ist immer in der ersten Woche des Jahres. Ich würde jetzt den Wochentag des 4. Januar ermitteln und prüfen ob das nicht schon der Montag ist, wenn nicht entsprechend zurückrechnen !

LG Mario

marabu 10. Jul 2006 06:07

Re: GetStartOfFirstWeekInYearISO8601
 
Guten Morgen,

Mario erinnert sich richtig - deshalb funktioniert das hier auch:

Delphi-Quellcode:
uses
  DateUtils;

function StartOfTheFirstWeek(year: Word): TDateTime;
begin
  Result := StartOfTheWeek(EncodeDate(year, 1, 4));
end;
Grüße vom marabu

Hobby-Programmierer 10. Jul 2006 06:27

Re: GetStartOfFirstWeekInYearISO8601
 
... einen hab ich noch :lol:
Delphi-Quellcode:
 
  Form1.Caption:= FormatDateTime('dd.mm.yyyy', StartOfAWeek((StrToInt(lbx.Items[lbx.ItemIndex])),1,1));

[edit] oder natürlich so wie marabu :o [/edit]
LG Mario

PeterPanino 10. Jul 2006 11:27

Re: GetStartOfFirstWeekInYearISO8601
 
Also, hier etwas zum ISO 8601 Standard (aus der Delphi Hilfe):

Zitat:

... ISO-Standards 8601. Demzufolge beginnt eine Woche am Montag und endet am Sonntag. Die erste Woche eines Jahres ist die erste Kalenderwoche, deren Donnerstag in das betreffende Jahr fällt (die erste Woche mit mindestens vier Tagen im Jahr). Ist also der erste Kalendertag eines Jahres der Freitag, Samstag oder Sonntag, gibt WeekOf 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 WeekOf 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.
Wie aus diesem Text ersichtlich ist, kann der erste Tag der ersten Woche eines Jahres X durchaus auch auf den 29. Dezember des Jahres X-1 fallen.

Bitte seht euch mein Beispielprogramm an: Die Funktion GetStartOfFirstWeekInYearISO8601 liefert absolut richtige Ergebnisse, wie mit Hilfe des Monatskalenders im Programm empirisch bestätigt werden kann. Dieses Monatskalender-Steuerelement (TMonthCalendar) ist ein Wrapper des in Windows integrierten Steuerelementes, dessen angezeigte Wochennummern offensichtlich ebenfalls nach ISO 8601 Standard berechnet werden.

Meine Frage war lediglich: Gibt es eine einfachere Methode, um den ersten Tag der ersten Woche eines Jahres nach ISO 8601 Standard zu bestimmen?

PeterPanino 10. Jul 2006 11:49

Re: GetStartOfFirstWeekInYearISO8601
 
Nochmals vielen Dank an Mario und marabu für eure Beispiele! Ich muss heute schlecht geschlafen haben, deswegen habe ich den Sinn eurer Antworten nicht gleich erkannt.

Und ist folgende Aussage wahr (oder nicht?): Der 1., 2., 3. und 4. Kalendertag eines Jahres fallen IMMER in die 1. Kalenderwoche dieses Jahres (nach ISO 8601). Dementsprechend müsste die Funktion mit StartOfTheWeek für alle diese Tage das gleiche Ergebnis liefern?

Nicolai1234 10. Jul 2006 13:04

Re: GetStartOfFirstWeekInYearISO8601
 
Zitat:

Zitat von PeterPanino
Nochmals vielen Dank an Mario und marabu für eure Beispiele! Ich muss heute schlecht geschlafen haben, deswegen habe ich den Sinn eurer Antworten nicht gleich erkannt.

Und ist folgende Aussage wahr (oder nicht?): Der 1., 2., 3. und 4. Kalendertag eines Jahres fallen IMMER in die 1. Kalenderwoche dieses Jahres (nach ISO 8601). Dementsprechend müsste die Funktion mit StartOfTheWeek für alle diese Tage das gleiche Ergebnis liefern?

Nein, nur der 4. Januar ist in der ersten Woche.

marabu 10. Jul 2006 13:53

Re: GetStartOfFirstWeekInYearISO8601
 
Hallo Peter,

Zitat:

Zitat von PeterPanino
Und ist folgende Aussage wahr (oder nicht?): Der 1., 2., 3. und 4. Kalendertag eines Jahres fallen IMMER in die 1. Kalenderwoche dieses Jahres (nach ISO 8601).

Weiter oben hast du doch schon völlig richtig geschrieben, dass der Beginn der ersten Kalenderwoche eines Jahres durchaus im Vorjahr liegen kann.

Korrekt ist, dass der 4. Januar immer in der ersten KW liegt, oder anders ausgedrückt: der größere Teil der ersten KW muss im neuen Jahr liegen.

Freundliche Grüße

marabu

PeterPanino 10. Jul 2006 14:19

Re: GetStartOfFirstWeekInYearISO8601
 
Zitat:

Zitat von marabu
Hallo Peter,

Korrekt ist, dass der 4. Januar immer in der ersten KW liegt, oder anders ausgedrückt: der größere Teil der ersten KW muss im neuen Jahr liegen.

Freundliche Grüße

marabu

Ja, du hast recht: Wenn die 1. Kalenderwoche am 4. Jänner eines Jahres beginnt (wie z.B. im Jahr 1993), dann liegen der 1., 2. und 3. Jänner natürlich nicht in der 1. Kalenderwoche!

negaH 10. Jul 2006 15:29

Re: GetStartOfFirstWeekInYearISO8601
 
Delphi-Quellcode:
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;
Berechnet das Datum zu einer Kalenderwoche und Jahr, kommt ohne Schleifen aus, kann mit negativen Kalenderwochen arbeiten und auch mit zu großen Kalenderwochenangaben.

Delphi-Quellcode:
function DayOfWeekGerman(ADate: TDateTime): Integer;
begin
  Result := DayOfWeek(ADate) -1;
  if Result <= 0 then Result := 7;
end;

function WeekOfDate(A: TDateTime): Integer;
var
  Day: Integer;
  Y,M,D: Word;
begin
  Day := DayOfWeekGerman(A);
  DecodeDate(A +4 -Day, Y, M, D);
  Result := Round(((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7);
end;
WeekOfDate() berechnet die KW zu einem Datum.

KEINE Garantie auf Richtigkeit !!

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 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