Kalenderwoche berechnen.
-
Hi all,
wie berechne ich ganz allgemein ohne fertige Module und Sonderfunktionalität Kalenderwochen?
Ich hab mir schon nen Ast gesucht und komme nur bei irgendwelchen ISO 8601 Spezifikationen raus oder wie man KW in VB-Skript und co. berechnet.
Wie berechne ich die KW korrekt, wenn ich nur folgende Infos hab und keine sonder-Bindings/libs/module usw. nutzen kann oder will:
struct Datum { unsigned int jahr; // + 1970 unsigned int monat; // % 12 unsigned int tag; // % 30 (oder 31, keine Ahnung) }; unsigned int datum_to_kw(struct Datum *d) { unsigned int kw; // mathematicall magic // sim-sala-bim return kw; }
Am liebsten mit schlüssiger Erklärung statt nur blankem Code (und bitte Konstanten aufsplitten!! in 365*x*y usw., statt große c's, wo niemand sieht, was dahinter steckt.)
Wäre nett wenn mich da jemand an die Hand nehmen könnte.
Thx in advance.
-
Direkt von Wikipedia ein Algorithmus:
In Pseudocode:
Determine its Day of Week, D Use that to move to the nearest Thursday (-3..+3 days) Note the year of that date, Y Obtain January 1 of that year Get the Ordinal Date of that Thursday, DDD of YYYY-DDD Then W is 1 + (DDD-1) div 7
In Java:
public ISO_Week(DateTime dt) { dayOfWeek = 1 + ((int)dt.DayOfWeek + 1+5) % 7; // Mon=1 to Sun=7 DateTime NearestThu = dt.AddDays(4 - dayOfWeek); year = NearestThu.Year; DateTime Jan1 = new DateTime(year, 1, 1); TimeSpan ts = NearestThu.Subtract(Jan1); week = 1 + ts.Days / 7; // Count of Thursdays } }
Der schwierige Schritt ist natürlich das berechnen des Wochentages ohne Hilfe. Doch auch dafür gibt es Algorithmen, wieder direkt aus Wikipedia:
f = (14-Monat) / 12 y = jahr - f m = monat + 12*f - 2 x = (tag + y + 31*m/12 + y/4 - y/100 +y/400) mod 7 Sonntag: x=0 bis Samstag: x=6