![]() |
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:
Gibt es eine einfachere Methode, um zu diesem Ergebnis zu kommen?
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; Ein kleines Testprogramm habe ich angehängt. |
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 |
Re: GetStartOfFirstWeekInYearISO8601
Guten Morgen,
Mario erinnert sich richtig - deshalb funktioniert das hier auch:
Delphi-Quellcode:
Grüße vom marabu
uses
DateUtils; function StartOfTheFirstWeek(year: Word): TDateTime; begin Result := StartOfTheWeek(EncodeDate(year, 1, 4)); end; |
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 |
Re: GetStartOfFirstWeekInYearISO8601
Also, hier etwas zum ISO 8601 Standard (aus der Delphi Hilfe):
Zitat:
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? |
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? |
Re: GetStartOfFirstWeekInYearISO8601
Zitat:
|
Re: GetStartOfFirstWeekInYearISO8601
Hallo Peter,
Zitat:
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 |
Re: GetStartOfFirstWeekInYearISO8601
Zitat:
|
Re: GetStartOfFirstWeekInYearISO8601
Delphi-Quellcode:
Berechnet das Datum zu einer Kalenderwoche und Jahr, kommt ohne Schleifen aus, kann mit negativen Kalenderwochen arbeiten und auch mit zu großen Kalenderwochenangaben.
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;
Delphi-Quellcode:
WeekOfDate() berechnet die KW zu einem Datum.
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; KEINE Garantie auf Richtigkeit !! Gruß Hagen |
Re: GetStartOfFirstWeekInYearISO8601
Wie hier
![]()
Delphi-Quellcode:
Man muß also aus dem TDateTime A den Nachkommateil, eg. Zeitangaben, löschen. Das erledigen wir mit dem A := Int(A);
function WeekOfDate(A: TDateTime): Integer;
var Day: Integer; Y,M,D: Word; begin A := Int(A); Day := DayOfWeekGerman(A); DecodeDate(A +4 -Day, Y, M, D); Result := Round(((A +8 -Day) - EncodeDate(Y, 1, 1)) / 7); end; Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz