Kurzantwort

API und einbettbares KW-Widget

Dokumentierte JSON-Endpunkte und ein trackerfreies Widget für ISO-Kalenderwochen.

Kurzantwort

Die API validiert Eingaben und liefert stabile Fehlercodes; das Widget benötigt keine fremden Fonts.

So funktioniert es

CORS ist standardmäßig restriktiv. Maschinenlesbare Verträge stehen als OpenAPI-Datei bereit.

JavaScript: ISO-Datum ohne Zeitzonenverschiebung

Das folgende vollständige Rezept nimmt ausschließlich YYYY-MM-DD von 1900 bis 2100 an, lehnt ungültige Tage ab und rechnet mit UTC-Kalendertagen. Ein Zeitpunkt mit Uhrzeit muss vorher in der gewünschten IANA-Zeitzone auf ein Datum reduziert werden. 2027-01-01 ergibt { isoYear: 2026, isoWeek: 53, isoWeekday: 5 }.

Ausführung: Node.js 24.19.0, Python 3.14.3 und SQLite 3.53.3. Die angezeigten Rezepte werden für jeden der 73.414 Tage von 1900 bis 2100 sowie acht ungültige Eingaben gegen denselben Kalenderkern geprüft.

function isoWeekDate(value) {
  if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value))
    throw new RangeError("Use a date in YYYY-MM-DD format");
  const [year, month, day] = value.split("-").map(Number);
  if (year < 1900 || year > 2100) throw new RangeError("Supported years: 1900–2100");
  const date = new Date(Date.UTC(year, month - 1, day));
  if (date.toISOString().slice(0, 10) !== value) throw new RangeError("Invalid date");
  const isoWeekday = date.getUTCDay() || 7;
  date.setUTCDate(date.getUTCDate() + 4 - isoWeekday);
  const isoYear = date.getUTCFullYear();
  const isoWeek = Math.ceil(((date.getTime() - Date.UTC(isoYear, 0, 1)) / 86400000 + 1) / 7);
  return { isoYear, isoWeek, isoWeekday };
}
isoWeekDate("2027-01-01");

Python: date.isocalendar()

Python date.isocalendar() liefert Wochenjahr, Woche und ISO-Wochentag gemeinsam. Das Rezept prüft zusätzlich das Eingabeformat und den unterstützten Jahresbereich. Es nimmt ein Datum an, keinen Zeitstempel.

from datetime import date

def iso_week_date(value):
    day = date.fromisoformat(value)
    if day.isoformat() != value or not 1900 <= day.year <= 2100:
        raise ValueError("Use YYYY-MM-DD, years 1900–2100")
    year, week, weekday = day.isocalendar()
    return {"isoYear": year, "isoWeek": week, "isoWeekday": weekday}
print(iso_week_date("2027-01-01"))

Python: datetime.date ↗

SQLite: %G / %V / %u

SQLite: :date als Textparameter binden, nicht durch Stringverkettung einsetzen. %G und %V gehören zusammen; %Y mit %W ist kein gleichwertiger Ersatz. Die WHERE-Bedingung verwirft ungültige oder nicht normalisierte Tage. Ältere SQLite-Versionen ohne %G/%V sind nicht geeignet.

SELECT CAST(strftime('%G', :date) AS INTEGER) AS isoYear,
       CAST(strftime('%V', :date) AS INTEGER) AS isoWeek,
       CAST(strftime('%u', :date) AS INTEGER) AS isoWeekday
WHERE length(:date) = 10
  AND :date GLOB '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
  AND substr(:date, 1, 4) BETWEEN '1900' AND '2100'
  AND date(:date, '+0 days') = :date;

SQLite: date and time functions ↗

Weitere SQL-Dialekte: getrennte Rezepte

Diese drei Beispiele sind aus den Herstellerfunktionen abgeleitet, aber hier nicht in PostgreSQL, MySQL oder SQL Server ausgeführt. Für 2027-01-01 ist jeweils ISO-Jahr 2026 und Woche 53 zu erwarten. Vor Einsatz die eigene Engineversion testen. Bei Zeitstempeln die Geschäftszeitzone zuerst festlegen.

PostgreSQL: ISOYEAR + WEEK

SELECT EXTRACT(ISOYEAR FROM d)::int AS iso_year,
       EXTRACT(WEEK FROM d)::int AS iso_week
FROM (VALUES (DATE '2027-01-01')) AS dates(d);

PostgreSQL: date/time fields ↗

MySQL: YEARWEEK(date, 3)

SELECT YEARWEEK('2027-01-01', 3) DIV 100 AS iso_year,
       MOD(YEARWEEK('2027-01-01', 3), 100) AS iso_week;

MySQL: YEARWEEK ↗

SQL Server: iso_week

DECLARE @d date = DATEFROMPARTS(2027, 1, 1);
SELECT CASE
         WHEN MONTH(@d) = 1 AND DATEPART(iso_week, @d) >= 52 THEN YEAR(@d) - 1
         WHEN MONTH(@d) = 12 AND DATEPART(iso_week, @d) = 1 THEN YEAR(@d) + 1
         ELSE YEAR(@d)
       END AS iso_year,
       DATEPART(iso_week, @d) AS iso_week;

Microsoft: DATEPART ↗

REST API v1

CORS ist standardmäßig restriktiv. Maschinenlesbare Verträge stehen als OpenAPI-Datei bereit.

OpenAPI 3.1 JSON Widget

fetch("https://kalenderwoche.info/api/v1/week-from-date?date=2026-08-05")
  .then(response => response.json())