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