AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetStartOfFirstWeekInYearISO8601

Ein Thema von PeterPanino · begonnen am 10. Jul 2006 · letzter Beitrag vom 17. Apr 2010
Antwort Antwort
Seite 1 von 2  1 2      
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#1

GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 02:08
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.
Angehängte Dateien
Dateityp: zip getdayoffirstweekinyear_190.zip (2,7 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#2

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 06:57
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
Mario
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 07:07
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
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#4

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 07:27
... einen hab ich noch
Delphi-Quellcode:
 
  Form1.Caption:= FormatDateTime('dd.mm.yyyy', StartOfAWeek((StrToInt(lbx.Items[lbx.ItemIndex])),1,1));

[edit] oder natürlich so wie marabu [/edit]
LG Mario
Mario
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 12:27
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?
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 12:49
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?
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 14:04
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 14:53
Hallo Peter,

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
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 15:19
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!
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: GetStartOfFirstWeekInYearISO8601

  Alt 10. Jul 2006, 16:29
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:08 Uhr.
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