Kalenderwoche Berechnen

Hallo

Gibt es eine Formel zu Berechnung der Kalenderwoche aus den Unix-Timestamp?

Man könnte das ja so machen

unsigned long Unix;

int KW;

 void setup()
{
	Serial.begin(9600);

	Unix = 1396183527; // Entspricht den 30.03.2014 um 14:45:27 Uhr 

	KW = (Unix % 31557600) / 604800 + 1;	// + 1 für die erste Woche sonst wer sie ja 0 KW

	Serial.println(KW);
}

void loop()
{

}

aber es gibt ja den 1, 2, und 3 Januar der in der 53 KW des vor Jahres liegt.

Formel ist mir gerade keine Bekannt. Aus dem UNIX-Stamp kannst du ja das Jahr "extrahieren". Nun fehlt dir lediglich der Wochentag, dieser ist wie folgt zu erstellen

Alternativ DS3231 RTC mit DS3231 Libary, der berechnet die Wochentage eigenständig.

Um den Wochentag zu Berechnen ist das die Formel.

Tag = (((Unix / 86400UL + 4) % 7UL) + 1);	//Wochentag Berechnung 1 ist Sonntag

Ich möchte aber die Kalenderwoche Berechnen.

Ja, dann haste doch den Grundstein für die Berechnung der KW.

Abfragen, wo der erste Montag im Jahr ist. Dort beginnt deine KW. Nun kannste mit einer einfachen Division (vergangene Tage im Jahr / 7) die KW berechnen.

Ingo79:
aber es gibt ja den 1, 2, und 3 Januar der in der 53 KW des vor Jahres liegt.

Ja, gar nicht so einfach.
Es gibt auch den Fall, dass der 31.12.2012 zum Beispiel zur ersten Kalenderwoche 2013 gehört:

Du meinst mit Kalenderwoche wahrscheinlich die katholisch-christliche Kalenderwoche, bei der der Sonntag der letzte Tag der Woche ist und die Woche immer mit einem Montag beginnt, genormt nach der internationalen ISO 8601, oder?

Es gäbe da auch noch die Woche, wie sie in den USA gezählt wird, nach jüdisch-christlicher und islamischer Tradition mit dem "Sabbat" (Sonnabend) als letztem Tag der Woche und Wochenanfang am Sonntag.

Also wenn Du im Internet nach Formeln für die Kalenderwochen suchst, dann aufpassen, ob Du eine Formel für die katholischen oder für die jüdischen/islamischen Kalenderwochen findest, sonst wird es für die Verwendung innerhalb er EU (ISO 8601, Wochenanfang= Montag) eventuell falsch!

Kritisch sind bei der Berechnung insbesondere die letzte und die erste Woche eines Jahres.
Mal gibt es eine 53. Kalenderwoche (immer wenn der 01.01. ein Donnerstag ist), meistens aber nicht.
Mal endet das Jahr mit der ersten Kalenderwoche des nachfolgenden Jahres.
Und mal beginnt ein Jahr auch mit der letzten Kalenderwoche des Vorjahres.

Falls Du Hilfe benötigst, kann ich Dir was raussuchen.

Hallo jurs

Ja ich meine die katholisch-christliche Kalenderwoche habe auch schon diese Seite Helferlein - Kalenderwoche und Woche – Wikipedia gefunden.
Ich werde mich am kommenden Wochenende da mal dran setzen.

Ingo79:
Ja ich meine die katholisch-christliche Kalenderwoche habe auch schon diese Seite Helferlein - Kalenderwoche und Woche – Wikipedia gefunden.

Ja, das ist dort vollkommen korrekt dargestellt.

Wenn Du selbst Code schreibst, der für alle Jahre funktionieren soll, mußt Du im Prinzip 14 verschiedene Fälle testen: Nicht-Schaltjahre, die mit einem der 7 Wochentage beginnen, und Schaltjahre, die mit einem der sieben Wochentage beginnen. Wenn diese 14 Fälle hinhauen, sollte der Code OK sein.

Ansonsten google mal nach "Kalenderwoche nach dem C++-Algorithmus von Ekkehard Hess".
Da habe ich mit etwas Stöbern Code im Internet gefunden, den man wohl für AVR GCC umschreiben kann.

Wie ich mal in Berlin erfahern mußte ist die KW-Definition nicht so eindeutig/logisch. Dort werden beim Entwerten der Fahrscheine nicht das Datum des Entwerttages sondern Wochentag und Kalenderwoche benutzt.
Grüße Uwe

In europäischen Kalendern gilt:
Der erste Donnerstag eines Jahres liegt immer in KW 1.
Der Montag ist der Beginn einer KW, also ist der Montag vor dem ersten Donnerstag eines Jahres der Beginn von KW 1.
Ab dort kann man modulo 7 weiterzählen, bis man wieder auf einen Montag kommt, der nach der obigen Regel zu einer KW 1 gehört.

Super einfach und praktisch, dass die Wochentage nie Sprünge haben, selbst in Schaltjahren nicht :wink:
Vielleicht ist das der Grund für den BVB-Code.

Andere gleichwertige Faustregeln und viel weiteres Material z.B. hier