Kalenderwoche programmieren: ISO-Woche in PHP, JavaScript und SQL
Bei Kalenderwochen reicht die Wochennummer allein nicht aus. Robuste Programme speichern immer ISO-Woche und ISO-Wochenjahr zusammen.
Grundregel fuer Entwickler
Speichern oder vergleichen Sie Kalenderwochen nie nur als Zahl. KW 1 kommt jedes Jahr vor, und am Jahreswechsel kann das ISO-Wochenjahr vom Kalenderjahr abweichen. Robust ist ein Paar aus ISO-Jahr und ISO-Woche, optional mit Montag und Sonntag der Woche.
PHP: ISO-Woche und ISO-Jahr
PHP bringt die wichtigen Formatzeichen bereits mit: W fuer die ISO-Woche und o fuer das ISO-Wochenjahr.
<?php
$date = new DateTimeImmutable('2026-12-31');
$isoYear = $date->format('o'); // 2026
$week = $date->format('W'); // 53
$label = $isoYear . '-KW' . $week; // 2026-KW53
Wichtig: Y-W ist fuer KW-Labels falsch, weil Y das Kalenderjahr ausgibt. Verwenden Sie fuer Kalenderwochen o-W.
JavaScript: ISO-Woche selbst berechnen
JavaScript hat keine eingebaute ISO-KW-Funktion. Eine bewaehrte Methode verschiebt das Datum auf den Donnerstag derselben Woche und leitet daraus das ISO-Jahr ab.
function isoWeek(input) {
const d = new Date(Date.UTC(input.getFullYear(), input.getMonth(), input.getDate()));
const day = d.getUTCDay() || 7; // Sonntag wird 7
d.setUTCDate(d.getUTCDate() + 4 - day);
const isoYear = d.getUTCFullYear();
const yearStart = new Date(Date.UTC(isoYear, 0, 1));
const week = Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
return { isoYear, week };
}
Nutzen Sie UTC, damit lokale Zeitumstellungen die Berechnung nicht unbemerkt verschieben.
SQL: Datenbankfunktionen unterscheiden sich
-- PostgreSQL
SELECT EXTRACT(ISOYEAR FROM datum) AS iso_jahr,
EXTRACT(WEEK FROM datum) AS kw
FROM termine;
-- MySQL / MariaDB
SELECT YEARWEEK(datum, 3) AS iso_jahr_kw,
WEEK(datum, 3) AS kw
FROM termine;
-- SQL Server
SELECT DATEPART(isowk, datum) AS kw
FROM termine;
Pruefen Sie bei jeder Datenbank, ob auch das ISO-Jahr verfuegbar ist. In SQL Server liefert DATEPART(isowk, ...) die ISO-Woche, das passende ISO-Jahr muss bei Jahreswechsel-Faellen separat behandelt und getestet werden.
Testfaelle, die jede Implementierung bestehen sollte
2018-12-31ergibt2019-W01.2021-01-01ergibt2020-W53.2026-12-31ergibt2026-W53.2027-01-01ergibt2026-W53.
Weiterführend: ISO-Wochenjahr, ISO-Wochendatum und KW-Daten exportieren.