Zum Inhalt springen
Wartung & Updates

KW 53 und Jahreswechsel: Datumsfehler im Shop vermeiden

Der 1. Januar 2027 liegt noch in KW 53 des Jahres 2026. So prüfen Sie Wochenformate, Zeitzonen, Nummernkreise, Feiertage und Aktionen im Shop vor Neujahr.

22 Min. Lesezeit JahreswechselShop-BetriebCronjobsWartung

Kurz und einfach erklärt

Am 1. Januar 2027 beginnt ein neues Jahr. Die neue Woche beginnt aber erst am 4. Januar. Die Tage davor gehören noch zur Woche 53 von 2026.

Manche Shops schreiben dann die falsche Jahreszahl zur Woche. Dann stimmen Berichte und Dateinamen nicht.

Auch die Uhrzeit zählt. Der Server rechnet oft mit einer anderen Zeit als Berlin. Dann kann eine Rechnung aus der Nacht zum 1. Januar im alten Jahr landen.

Prüfen Sie auch Feiertage, Rabatte und Gutscheine. Rabatte und Gutscheine enden oft zum Jahresende.

Testen Sie das vorher. Dazu stellt man in einer Kopie des Shops die Uhr vor.

Am 1. Januar 2027 beginnt ein neues Kalenderjahr, aber noch keine neue Kalenderwoche. Nach ISO 8601 läuft die KW 53 des Jahres 2026 vom Montag, 28. Dezember 2026, bis zum Sonntag, 3. Januar 2027. Das Jahr 2026 hat damit 53 ISO-Wochen statt der üblichen 52 (strftime(3)). Genau an solchen Tagen zeigt sich, wie ein Shop mit Datumswerten umgeht: Wochenberichte springen ins falsche Jahr, Exportdateien bekommen Namen, die es schon gibt, eine Rechnung aus der ersten Stunde des Jahres trägt das Datum vom 31. Dezember, und die Lieferzeitanzeige rechnet über Neujahr hinweg, als wäre es ein Werktag. Keiner dieser Fehler ist neu, aber zum Jahreswechsel 2026/2027 treffen sie zusammen, und sie treffen auf eine Woche, in der viele Teams zwischen den Feiertagen dünn besetzt sind. Dieser Beitrag zeigt, wo die Datumslogik eines Shops am Jahresende bricht, wie Sie Wochenformate, Zeitzonen, Nummernkreise, Feiertage und Aktionsenddaten prüfen und wie ein Probelauf auf Staging den Jahreswechsel vorwegnimmt.

Das Wichtigste in Kürze

  • Das ISO-Wochenjahr 2026 hat 53 Wochen (strftime(3)): Die KW 53 läuft vom 28. Dezember 2026 bis zum 3. Januar 2027, der 1. Januar 2027 gehört also noch zur Woche 2026-W53.
  • Wer Wochen mit dem Kalenderjahr formatiert, erhält für Neujahr „2027-W53“. Richtig ist das ISO-Wochenjahr: in PHP o statt Y (PHP-Handbuch), in Skripten %G statt %Y (strftime(3)), in SQL YEARWEEK(datum, 3) (MariaDB-Dokumentation).
  • Mitternacht in Berlin ist im Winter 23 Uhr Weltzeit (§ 4 EinhZeitG). Shopware speichert Zeitpunkte in UTC (Shopware-Dokumentation), deshalb brauchen Belege und Berichte eine festgelegte Geschäftszeitzone.
  • Aufbewahrungsfristen beginnen mit dem Schluss des Kalenderjahrs (§ 147 AO), die regelmäßige Verjährung von drei Jahren ebenfalls (§ 195 BGB, § 199 BGB). Löschläufe rechnen deshalb ab Jahresschluss; die Gültigkeit von Gutscheinen klärt die Rechtsberatung.
  • Lieferzeiten rechnet Shopware ab dem aktuellen Datum (Shopware-Dokumentation). Wer konkrete Liefertermine anzeigt, braucht die Feiertage 2027 im Kalender, auch die beweglichen ab dem Ostersonntag am 28. März.
  • Ein Probelauf auf Staging mit vorgestellter Uhr, etwa auf den 31. Dezember um 23:30 Uhr, zeigt Formatfehler, Rabatt-Enddaten und Cronjobs vor dem Ernstfall. Korrekturen gehören vor einen Änderungsstopp im Dezember.

Warum 2026 53 Kalenderwochen hat

Die Wochenzählung nach ISO 8601 folgt drei Regeln: Eine Woche beginnt am Montag, die Wochen eines Jahres werden von 01 bis 52 oder 53 durchnummeriert, und Woche 01 ist die erste Woche, von der mindestens vier Tage ins neue Jahr fallen (strftime(3)). Gleichbedeutend formuliert dieselbe Handbuchseite: Woche 01 ist die Woche mit dem ersten Donnerstag des Jahres, oder die Woche, in der der 4. Januar liegt. Daraus folgt der Kern des Problems. Eine Kalenderwoche gehört nicht zu dem Jahr, in dem ihr Montag liegt, sondern zu dem Jahr, in dem ihr Donnerstag liegt. Dieses Jahr heißt ISO-Wochenjahr, und es weicht an den Rändern vom Kalenderjahr ab.

Für den Jahreswechsel 2026/2027 bedeutet das: Der 1. Januar 2026 war ein Donnerstag, damit begann das ISO-Wochenjahr 2026 schon am Montag, 29. Dezember 2025. Die Woche vom 28. Dezember 2026 bis 3. Januar 2027 enthält den Donnerstag, 31. Dezember 2026, und zählt deshalb als Woche 53 des Jahres 2026. Neujahr sowie der 2. und 3. Januar 2027 liegen also im neuen Kalenderjahr, aber im alten Wochenjahr. Die KW 1 des Jahres 2027 beginnt erst am Montag, 4. Januar 2027. Die Python-Dokumentation beschreibt dasselbe aus Sicht des Kalenders: Ein ISO-Jahr besteht aus 52 oder 53 vollen Wochen, die am Montag beginnen und am Sonntag enden (Python-Dokumentation). Nach denselben Regeln hatten auch 2015 und 2020 eine KW 53, das nächste Mal folgt 2032.

Die Handbuchseite liefert ein Beispiel, das sich wie eine Vorlage für 2027 liest: Der 1. Januar 2010 war ein Freitag, nur drei Tage dieser Kalenderwoche fielen ins neue Jahr, und deshalb zählten sie als Woche 53 des Jahres 2009 (strftime(3)). Dieselbe Lage gab es zuletzt am 1. Januar 2021, und am 1. Januar 2027 kehrt sie zurück. Wer die Datumslogik seines Shops seitdem umgebaut oder um Erweiterungen ergänzt hat, sollte nicht davon ausgehen, dass sie den Fall noch beherrscht. Die Tabelle zeigt die betroffenen Tage.

DatumWochentagKalenderjahrISO-WocheKennung richtigKennung mit Kalenderjahr
28.12.2026Montag2026532026-W532026-W53
31.12.2026Donnerstag2026532026-W532026-W53
01.01.2027Freitag2027532026-W532027-W53 (falsch)
03.01.2027Sonntag2027532026-W532027-W53 (falsch)
04.01.2027Montag202712027-W012027-W01

Der Formatfehler: Kalenderjahr statt Wochenjahr

Die meisten Datumsbibliotheken kennen zwei Jahresangaben: das Kalenderjahr und das ISO-Wochenjahr. In PHP stehen dafür die Formatzeichen Y und o. Das Handbuch beschreibt o als ISO-Wochenjahr, das denselben Wert wie Y hat, außer wenn die ISO-Woche W zum Vorjahr oder zum Folgejahr gehört; dann wird dieses Jahr verwendet (PHP-Handbuch). Wer eine Wochenkennung als Y-\WW formatiert, kombiniert also das Kalenderjahr mit der ISO-Woche und erzeugt am 1. Januar 2027 die Kennung „2027-W53“, eine Woche, die es im Jahr 2027 nicht gibt. Richtig ist o-\WW mit dem Ergebnis „2026-W53“.

Für Shopware ist das mehr als eine Randnotiz, denn Storefront, Mailvorlagen und Belegvorlagen formatieren Datumswerte in Twig. Der date-Filter von Twig verwendet dieselben Formatzeichen wie die PHP-Funktion date (Twig-Dokumentation). Eine Vorlage, die eine Lieferwoche, eine Abholwoche oder die Kalenderwoche in einem Wochenbericht ausgibt, übernimmt den Fehler eins zu eins, wenn darin Y statt o steht. Dasselbe gilt für Erweiterungen, die Lieferwochen für Speditionsware oder den Rhythmus von Abos berechnen. Das folgende Beispiel zeigt die vier Tage, an denen sich die beiden Fassungen unterscheiden oder gerade nicht unterscheiden.

wochenkennung.php
<?php
foreach (['2025-12-29', '2026-12-31', '2027-01-01', '2027-01-04'] as $tag) {
    $d = new DateTimeImmutable($tag, new DateTimeZone('Europe/Berlin'));
    echo $tag, '  Y-W: ', $d->format('Y-\WW'), '  o-W: ', $d->format('o-\WW'), "\n";
}
// Ausgabe mit PHP 8.5:
// 2025-12-29  Y-W: 2025-W01  o-W: 2026-W01
// 2026-12-31  Y-W: 2026-W53  o-W: 2026-W53
// 2027-01-01  Y-W: 2027-W53  o-W: 2026-W53
// 2027-01-04  Y-W: 2027-W01  o-W: 2027-W01

Die erste Zeile zeigt, dass der Fehler nicht nur den Jahreswechsel nach einer KW 53 betrifft. Am 29. Dezember 2025 begann bereits die erste Woche des ISO-Wochenjahres 2026; mit Y formatiert wurde daraus „2025-W01“, dieselbe Kennung wie für die erste Januarwoche 2025. An allen Tagen stimmen Kalenderjahr und Wochenjahr nur in Jahren mit 53 ISO-Wochen überein, nämlich 2015, 2020 und 2026, danach erst wieder 2032. In allen übrigen Jahren trifft der Formatfehler die ersten Januartage, die letzten Dezembertage oder beide, insgesamt einen bis drei Tage. Dass er bisher nicht aufgefallen ist, heißt deshalb wenig: Oft steht er in einem Bericht, den in dieser Woche niemand genau liest.

Skripte und andere Sprachen haben dieselbe Falle mit anderen Zeichen. In date und strftime ist %G das Jahr zur ISO-Woche %V; es hat denselben Wert wie %Y, außer wenn die ISO-Woche zum Vorjahr oder Folgejahr gehört (strftime(3)). Die Python-Dokumentation hält ausdrücklich fest, dass %G und %Y nicht austauschbar sind (Python-Dokumentation). In Formatmustern nach dem Unicode-Standard für Datumsformate, wie sie viele Bibliotheken in Java, Swift oder JavaScript verwenden, steht das große Y für das Jahr im Wochenkalender, das nahe am Jahreswechsel vom Kalenderjahr y abweichen kann (Unicode LDML). Dort liegt die Falle umgekehrt: Wer YYYY-MM-dd statt yyyy-MM-dd schreibt, bekommt rund um den Jahreswechsel ein falsches Jahr in ein ganz normales Datum. Welche Tage betroffen sind, hängt sogar von der Regionaleinstellung ab, denn erster Wochentag und Mindestzahl der Tage in der ersten Woche können verändern, welchem Jahr ein Datum zugeordnet wird (Unicode LDML).

Wochenzahlen aus der Datenbank

Viele Wochenberichte entstehen nicht in PHP, sondern direkt in SQL: Umsatz je Kalenderwoche, Retouren je Woche, Bestellungen im Vergleich zur Vorjahreswoche. MariaDB berechnet die Wochennummer mit WEEK(), und das Ergebnis hängt von einem Modus ab. Die Modi 0 bis 7 unterscheiden, ob die Woche am Sonntag oder am Montag beginnt, ob die Zählung bei 0 oder 1 anfängt und welche Woche als erste gilt; nach ISO 8601 nummeriert nur Modus 3 (MariaDB-Dokumentation). Fehlt das zweite Argument, gilt der Wert der Systemvariablen default_week_format (MariaDB-Dokumentation), und dessen Voreinstellung ist 0, also Wochenbeginn am Sonntag und Zählung ab Woche 0 (MariaDB-Dokumentation).

wochenkennung.sql
SELECT WEEK('2027-01-01')         AS ohne_modus,      -- 0
       WEEK('2027-01-01', 3)      AS iso_woche,       -- 53
       CONCAT(YEAR('2027-01-01'), '-W', WEEK('2027-01-01', 3))
                                  AS gemischt,        -- 2027-W53
       YEARWEEK('2027-01-01', 3)  AS iso_jahr_woche;  -- 202653

Nachgemessen auf MariaDB 11.8 liefert der Aufruf ohne Modus für den 1. Januar 2027 die Woche 0, der ISO-Modus die Woche 53. Wer daneben YEAR() setzt, baut wieder die Kennung „2027-W53“ zusammen. Richtig ist YEARWEEK(datum, 3): Die Funktion gibt Jahr und Woche gemeinsam zurück, und die Dokumentation weist darauf hin, dass das Jahr im Ergebnis in der ersten und der letzten Woche vom Jahr des Datums abweichen kann (MariaDB-Dokumentation). Genau das ist hier gewollt.

Für Berichte folgt daraus eine einfache Regel: Die Wochenkennung wird an genau einer Stelle berechnet, als Paar aus ISO-Wochenjahr und ISO-Woche, und alle Berichte, Exporte und Dashboards übernehmen sie von dort. Wo eine Tabellenkalkulation die Daten weiterverarbeitet, gehört die fertige Kennung als Text in die Exportdatei, statt sie dort aus dem Datum neu berechnen zu lassen. Der Vergleich der KW 53 mit dem Vorjahr braucht zusätzlich eine Festlegung, denn 2025 hatte keine KW 53. Möglich ist der Vergleich mit der KW 52 des Vorjahres oder mit denselben Kalendertagen; welche Variante gilt, sollte im Bericht stehen, damit niemand im Januar einen Einbruch deutet, der nur aus der Zählweise kommt.

Mitternacht in Berlin ist 23 Uhr UTC

Die zweite Fehlerquelle am Jahresende ist die Zeitzone. Die gesetzliche Zeit in Deutschland ist im Winter die mitteleuropäische Zeit, bestimmt durch die koordinierte Weltzeit unter Hinzufügung einer Stunde (§ 4 EinhZeitG). Der Jahreswechsel um 0 Uhr in Berlin ist damit 23 Uhr am 31. Dezember in UTC. Eine Bestellung, die am 1. Januar 2027 um 0:30 Uhr eingeht, trägt in UTC noch das Datum 31. Dezember 2026. Wie sich Zeitzonen in Cronjobs und Zeitstempeln bei der Umstellung auf die Winterzeit auswirken, beschreibt der Beitrag zur Zeitumstellung am 25. Oktober.

Shopware speichert Datums- und Zeitwerte normiert in UTC, während verschiedene Teile des Systems ihre Anzeigezeitzone unterschiedlich wählen (Shopware-Dokumentation). Die Storefront kann sich nach der Zeitzone des Browsers richten, die Administration nach dem Profil des angemeldeten Nutzers. Mit Shopware 6.7.13.0 haben Verkaufskanäle eine optionale Geschäftszeitzone erhalten (Shopware-Dokumentation). Ist sie gesetzt, werden Belege des Verkaufskanals in dieser Zeitzone gerendert. Ist sie leer, hängt das Ergebnis in Version 6.7 vom Einstiegspunkt ab: Ein Beleg aus einer Storefront-Anfrage kann die Browserzeitzone des Kunden übernehmen, ein Beleg aus der Administration oder der Message Queue die konfigurierte Standardzeitzone von Twig. Ab Shopware 6.8 gilt ohne Geschäftszeitzone einheitlich die Twig-Standardzeitzone, und die ist UTC, solange niemand sie umstellt (Shopware-Dokumentation).

Was in der ersten Stunde des Jahres verrutscht

Entsteht eine Rechnung, ein Lieferschein oder ein Tagesbericht zwischen 0 und 1 Uhr am Neujahrsmorgen, entscheidet die Zeitzone, in welchem Jahr er landet. Betroffen sind das Rechnungsdatum, ein Jahresanteil in der Belegnummer, der Jahresumsatz im Bericht und der Zeitraum, für den ein Export Daten zieht. Die Geschäftszeitzone je Verkaufskanal und die Zeitzonen von Server, PHP, Datenbanksitzung und Cron-Dienst gehören deshalb vor dem 31. Dezember auf einen bekannten, dokumentierten Stand, für einen Shop in Deutschland in der Regel Europe/Berlin.

Nummernkreise, Belege und Aufbewahrungsfristen

Nummernkreise sind ein bekannter Prüfpunkt zum Jahreswechsel und hier deshalb nur einer von mehreren. Shopware beschreibt Nummernkreise als Folgen aus Zeichen und Ziffern, mit denen Bestellungen, Kunden oder Belege eindeutig gekennzeichnet werden; je nach Anforderung kann es nötig sein, Tag, Monat oder Jahr in den Nummernkreis aufzunehmen (Shopware-Dokumentation). Im erweiterten Modus nimmt ein Muster dafür Platzhalter wie {date} oder {date_d.m.Y} auf, die fortlaufende Zahl steht in {n} und beginnt bei der angegebenen Startnummer (Shopware-Dokumentation). Einen automatischen Neubeginn zum 1. Januar beschreibt die Dokumentation nicht.

Für Rechnungen verlangt das Umsatzsteuergesetz eine fortlaufende Nummer mit einer oder mehreren Zahlenreihen, die der Rechnungsaussteller einmalig vergibt (§ 14 Abs. 4 Nr. 4 UStG). Ein Jahresanteil in der Nummer ist damit möglich, verlangt an der Jahresgrenze aber Sorgfalt: Er muss das Kalenderjahr wiedergeben und nicht das Wochenjahr, er muss in derselben Zeitzone entstehen wie das Rechnungsdatum, und eine Umstellung des Musters zum 1. Januar darf keine Nummer ein zweites Mal erzeugen. Ob und wie ein Nummernkreis zum Jahreswechsel neu beginnt, stimmen Sie mit Ihrer Steuerberatung ab. Technisch prüfen lässt sich vorab, welche Nummer der erste Beleg des neuen Jahres bekommt und welches Datum darauf steht.

An der Jahresgrenze hängen auch Löschläufe. Die Aufbewahrungsfrist beginnt nach der Abgabenordnung mit dem Schluss des Kalenderjahrs, in dem zum Beispiel der Buchungsbeleg entstanden ist (§ 147 AO). Bücher und Aufzeichnungen sind zehn Jahre, Buchungsbelege acht Jahre und sonstige Unterlagen sechs Jahre aufzubewahren, sofern andere Steuergesetze keine kürzeren Fristen zulassen (§ 147 AO). Ein Löschjob, der mit „Erstellungsdatum plus acht Jahre“ rechnet, löscht deshalb zu früh: Ein Buchungsbeleg vom 5. Januar 2026 darf nicht schon im Januar 2034 fallen, seine Frist endet frühestens mit Ablauf des Jahres 2034. Wie sich Aufbewahrung und Datenschutz im Shop vertragen, beschreibt der Beitrag zur DSGVO-konformen Datensicherung und Aufbewahrung.

Lieferzeiten und Feiertage 2027

Shopware zeigt Lieferzeiten aus einer Einheit sowie einem Mindest- und einem Höchstwert an und kann daraus im Warenkorb einen voraussichtlichen Lieferzeitraum berechnen. Die Berechnung des Zeitraums geht vom aktuellen Datum aus (Shopware-Dokumentation). Die Beispieltabelle der Dokumentation setzt ausgerechnet am 1. Januar 2020 an: Bei einer Lieferzeit von 1 bis 3 Tagen und vorhandenem Bestand ergibt sich der Zeitraum vom 2. bis 4. Januar 2020 (Shopware-Dokumentation). Feiertage kommen in dieser Beschreibung nicht vor. Wer im Shop einen konkreten Liefertermin oder eine Lieferwoche anzeigt, sei es über eine Erweiterung, eine Versandanbindung oder eigene Logik, sollte deshalb prüfen, woher der Feiertagskalender kommt und ob er das Jahr 2027 schon kennt.

Die festen Feiertage sind schnell eingetragen, die beweglichen nicht. 2027 fällt der Ostersonntag auf den 28. März; damit liegen Karfreitag am 26. März, Ostermontag am 29. März, Christi Himmelfahrt am 6. Mai und Pfingstmontag am 17. Mai. Wer diese Termine in PHP berechnet, sollte eine Eigenheit kennen: easter_date() richtet sich nach der Umgebungsvariablen TZ statt nach der in PHP eingestellten Zeitzone, was zusammen mit anderen Datumsfunktionen zu unerwartetem Verhalten führen kann (PHP-Handbuch). Das Handbuch nennt als Ausweg easter_days() in Verbindung mit DateTime.

Dazu kommen die Länder, denn die meisten Feiertage regelt das Landesrecht. In Bayern ist zum Beispiel Heilige Drei Könige gesetzlicher Feiertag im ganzen Staatsgebiet (Art. 1 BayFTG); 2027 fällt der Tag auf den Mittwoch der ersten Januarwoche. Für die Lieferzeit zählt dabei nicht allein der Sitz des Shops, sondern auch der Standort von Lager und Versanddienstleister. Heiligabend und Silvester sind keine gesetzlichen Feiertage; ob Lager und Paketdienst an diesen Tagen voll arbeiten, regeln deren eigene Betriebskalender. Die folgende Liste fasst zusammen, was im Kalender der Lieferzeitlogik stehen sollte.

  • Feiertagsliste für 2027 vollständig, einschließlich der beweglichen Termine ab Ostern
  • Bundesland von Lager und Versandstart hinterlegt, nicht nur der Firmensitz
  • Betriebsruhe zwischen den Jahren als eigene Sperrtage eingetragen
  • letzter Versandtag vor Weihnachten im Shop angekündigt und mit der Lieferzeitlogik abgeglichen
  • Anzeige im Warenkorb für den 30. Dezember und den 4. Januar auf Staging nachgesehen

Aktionen, Gutscheine und Fristen zum Jahresende

Für den Handel fällt der Jahreswechsel in die umsatzstarke Zeit. Der Handelsverband Deutschland beziffert den Anteil der letzten beiden Monate am Jahresumsatz des Einzelhandels auf 18,5 Prozent (HDE). Für den Onlinehandel prognostiziert er im Weihnachtsgeschäft 2026 einen Umsatz von 23,1 Milliarden Euro (HDE). In einer vom Verband beauftragten Verbraucherumfrage planen 30 Prozent der Befragten, Geschenkgutscheine als Weihnachtsgeschenke zu kaufen; kein anderer Warenbereich wird häufiger genannt (HDE). Für die Datumslogik heißt das: Kurz vor dem Jahreswechsel laufen viele Aktionen aus, und kurz danach werden viele Gutscheine eingelöst.

Shopware-Aktionen haben je ein Feld für Beginn und Ende der Gültigkeit, mit denen sich festlegen lässt, ob und in welchem Zeitraum eine Aktion läuft (Shopware-Dokumentation). Am Jahresende lohnt der Blick auf drei Details. Erstens die Uhrzeit: Eine Aktion „bis 31. Dezember“ sollte bis 23:59 Uhr laufen und nicht um 0 Uhr desselben Tages enden. Zweitens die Zeitzone: Das Ende gehört im Probelauf mit Berliner Uhrzeit nachgesehen, nicht nur in der Maske. Drittens die Anschlussaktion: Eine Neujahrsaktion, die am 1. Januar um 0 Uhr beginnt, darf nicht mit der auslaufenden Aktion zusammentreffen, wenn beide nicht kombinierbar sein sollen. Wie Rabattcodes in der Spitzenzeit vor Missbrauch geschützt werden, steht im Beitrag zu Rabattcodes in der Black Week.

Gutscheine sind der zweite Punkt. Die regelmäßige Verjährungsfrist beträgt drei Jahre (§ 195 BGB) und beginnt, soweit nichts anderes bestimmt ist, mit dem Schluss des Jahres, in dem der Anspruch entstanden ist und der Gläubiger davon Kenntnis erlangt hat oder ohne grobe Fahrlässigkeit hätte erlangen müssen (§ 199 BGB). Eine Gültigkeit von „drei Jahren ab Kaufdatum“ und eine von „drei Jahren ab Jahresschluss“ ergeben deshalb verschiedene Enddaten, für einen Gutschein vom 20. Dezember 2026 den 20. Dezember 2029 oder den 31. Dezember 2029. Welche Gültigkeit für Ihre Gutscheine gilt, klärt die Rechtsberatung. Die Wartung sorgt dafür, dass die Einstellung im Shop dem entspricht, was in Ihren Bedingungen steht.

Cron kennt kein Jahr. Jede Zeile einer crontab hat fünf Zeit- und Datumsfelder, gefolgt vom Befehl (crontab(5)): Minute, Stunde, Tag, Monat und Wochentag. Ein Job, der für den 31. Dezember um 22 Uhr eingetragen wird, läuft deshalb jedes Jahr wieder, auch wenn er nur einmal gedacht war, etwa für das Ende einer Aktion. Die Kurzform @yearly steht für 0 0 1 1 * (crontab(5)), also Mitternacht am 1. Januar in der Zeitzone des Cron-Dienstes. Läuft der Server auf UTC, startet ein solcher Jahresjob um 1 Uhr Berliner Zeit; rechnet der Bericht das Jahr zudem in UTC ab, zählt er Bestellungen aus der ersten Berliner Stunde des neuen Jahres noch zum alten. Welche Jobs im Shop typischerweise laufen und wie sich stille Ausfälle erkennen lassen, beschreibt der Beitrag zu stillen Jobfehlern im Shop.

Dateinamen mit Jahresbezug haben dasselbe Problem wie Berichte. Ein Sicherungs- oder Exportskript, das seine Dateien nach dem Muster %Y-W%V benennt, schrieb am 29. Dezember 2025 eine Datei mit der Kennung „2025-W01“, denselben Namen wie in der ersten Januarwoche 2025. Je nach Aufbewahrung überschreibt das eine ältere Datei oder wirft zwei Wochen in einen Topf, und eine Rotation, die nach Namen sortiert, löscht womöglich die falsche Sicherung. Am 1. Januar 2027 entsteht umgekehrt die Kennung „2027-W53“, die sich in einer sortierten Liste hinter alle Wochen des Jahres 2027 einreiht. Richtig sind %G-W%V für Wochenkennungen und %F für alles, was nicht wochenweise abläuft; %F entspricht dem vollen Datum im Format %Y-%m-%d (strftime(3)).

Das sichtbarste Datum im Shop steht im Footer. Eine fest eingetragene Jahreszahl wie „© 2026“ wirkt am 2. Januar veraltet, und sie fällt Kunden eher auf als ein falsches Wochenformat. Wird das Jahr dynamisch erzeugt, muss es aus dem aktuellen Datum in der Zeitzone des Shops kommen, und ein Seiten-Cache liefert die alte Fassung so lange aus, bis er erneuert wird. Ob überhaupt ein Jahr im Footer steht, ist eine Gestaltungsfrage; steht eines dort, sollte es am Neujahrsmorgen stimmen. Dasselbe gilt für Jahresangaben in Rechtstexten, Versandhinweisen und Bannern, die auf „2026“ lauten.

Probelauf auf Staging mit vorgestellter Uhr

Auf den 31. Dezember zu warten, ist keine Teststrategie. Die meisten der beschriebenen Fehler lassen sich vorher auslösen, wenn eine Staging-Umgebung die Uhr auf die kritischen Zeitpunkte stellt: den 31. Dezember 2026 um 23:30 Uhr, den 1. Januar 2027 um 0:30 Uhr und den 4. Januar 2027 als ersten Werktag der KW 1. Auf Code-Ebene gibt es dafür eigene Werkzeuge. In PHP-Anwendungen auf Symfony-Basis stellt die Clock-Komponente eine Testuhr bereit, die mit einem festen Zeitpunkt startet und nicht von selbst weiterläuft (Symfony-Dokumentation). Eigener Code, der seine Zeit von einer solchen Uhr bezieht, lässt sich damit gezielt über den Jahreswechsel schieben.

Für einen Probelauf der ganzen Anwendung reicht das nicht, weil Datenbank, Cron-Dienst und Erweiterungen ihre Zeit selbst ermitteln. Dort wird die Systemzeit der Staging-Umgebung vorgestellt, und zwar nur dort. Ein paar Vorkehrungen gehören dazu: Mailversand und Zahlungsanbindungen im Testbetrieb, keine Verbindung zu Live-Schnittstellen und ein Blick auf Zertifikate und Tokens, deren Gültigkeit mit der vorgestellten Uhr anders aussehen kann. Wie eine Staging-Umgebung dafür aufgebaut wird, steht im Beitrag zu Staging-Umgebungen für sichere Updates.

31.12.2026 um 23:30 Uhr, 01.01.2027 um 0:30 Uhr und 04.01.2027 als erster Werktag der KW 1. Für jeden Zeitpunkt vorab aufschreiben, welche Ausgaben erwartet werden.

Der Probelauf ist zugleich eine Gelegenheit, die Prüfung dauerhaft zu machen. Ein automatischer Test, der die Wochenkennung für den 29. Dezember 2025, den 1. Januar 2027 und den 3. Januar 2027 prüft, kostet wenige Zeilen und schlägt bei jeder späteren Änderung an, die o wieder durch Y ersetzt. Dasselbe gilt für einen Test, der eine Rechnung für 0:30 Uhr am Neujahrsmorgen erzeugt und ihr Datum prüft.

Die Prüfliste vor dem 1. Januar

Die folgende Liste fasst die Punkte zusammen. Sie ist nach Aufwand geordnet: oben das, was sich mit einer Suche im Code klären lässt, unten das, was einen Probelauf braucht.

  • Wochenformat: Code, Twig-Vorlagen, Mailvorlagen und Skripte nach Y-W, %Y-W%V, YYYY und WEEK( ohne Modus durchsuchen und auf das ISO-Wochenjahr umstellen.
  • Berichte und Exporte: Wochenkennung an einer Stelle berechnen, als Text exportieren und den Vergleich der KW 53 mit dem Vorjahr festlegen.
  • Zeitzone: Geschäftszeitzone je Verkaufskanal sowie die Zeitzonen von PHP, Datenbanksitzung und Cron-Dienst dokumentieren und bewusst festlegen.
  • Nummernkreise: Muster mit Datumsanteil prüfen, die erste Nummer des neuen Jahres vorab ermitteln, Umstellungen mit der Steuerberatung abstimmen.
  • Löschläufe: Fristen ab Jahresschluss rechnen, nicht ab Erstellungsdatum.
  • Feiertage 2027: Kalender der Lieferzeitlogik um bewegliche Termine, Länderfeiertage und Betriebsruhe ergänzen.
  • Aktionen und Gutscheine: Enddaten mit Uhrzeit prüfen, Anschlussaktionen auf Überschneidung prüfen, Gültigkeit der Gutscheine gegen die Bedingungen halten.
  • Cronjobs und Dateinamen: einmalige Jobs mit festem Datum entfernen, Jahresjobs auf ihre Zeitzone prüfen, Dateinamen auf %G-W%V oder das volle Datum umstellen.

Zeitlich gehört die Liste in den November. Wer im Dezember einen Änderungsstopp plant, will dann keine Korrektur am Wochenformat mehr einspielen, und ein zweiter Probelauf braucht ebenfalls Zeit. Wie ein Änderungsstopp im Wartungsplan aufgebaut ist und welche Fristen sonst noch in den Dezember fallen, beschreibt der Beitrag zum Änderungsstopp vor dem Weihnachtsgeschäft. Für Rechnungen steht 2027 eine weitere Umstellung an, die im Beitrag zur E-Rechnung ab 2027 beschrieben ist.

Was die Wartung zum Jahreswechsel übernimmt

Datumsfehler zum Jahreswechsel sind selten spektakulär, aber sie sind teuer im Nachgang: Berichte müssen neu gerechnet, Belege geprüft und Exporte nachgeliefert werden, oft in einer Woche mit dünner Besetzung. In der Shopware-Wartung gehören die Überwachung und Pflege der Shopware-Cronjobs und Message-Queue-Worker sowie Updates mit vorheriger Prüfung auf einer Staging-Umgebung zum Umfang. Der Jahreswechsel lässt sich dort als fester Prüfpunkt in den Wartungsplan aufnehmen, mit Codesuche, Zeitzonenabgleich und Probelauf. Das Monitoring überwacht Erreichbarkeit und Fehlerlogs rund um die Uhr, auch in der Nacht zum 1. Januar.

Wochenformat

Code und Vorlagen auf Kalenderjahr statt Wochenjahr durchsuchen, Tests für die Randtage ergänzen.

Zeitzonen

Geschäftszeitzone, PHP, Datenbank und Cron-Dienst auf einen dokumentierten Stand bringen.

Belege und Nummern

Erste Nummer des Jahres und Rechnungsdatum aus der ersten Stunde vorab prüfen.

Lieferzeiten

Feiertage 2027 und Betriebsruhe im Kalender der Lieferzeitlogik ergänzen.

Aktionen

Enddaten, Uhrzeiten und Anschlussaktionen auf Staging durchspielen.

Neujahrsnacht

Cronjobs, Exporte und Fehlerlogs in der Nacht zum 1. Januar im Blick behalten.

Der Jahreswechsel ist nicht der einzige Termin, der in diesen Wochen in den Wartungsplan gehört. Wer vor dem Jahresende Zugänge und Zuständigkeiten durchgeht, sollte auch an Anrufe vom falschen Dienstleister denken, und wer für 2027 eine Sicherheitsprüfung plant, findet im Beitrag zum Penetrationstest für den Shop eine Entscheidungshilfe. Fragen zu Ihrem Shop klären wir über die Kontaktseite.

Quellen

Dieser Artikel basiert auf Daten aus: Linux man-pages, strftime(3) und crontab(5); PHP-Handbuch, DateTimeInterface::format und easter_date; Python-Dokumentation, Modul datetime; Unicode Technical Standard #35 (Unicode LDML), Teil 4 Datumsformate; MariaDB-Dokumentation, WEEK, YEARWEEK und default_week_format; Twig-Dokumentation, Filter date; Shopware-Dokumentation, Nummernkreise, Lieferzeiten, Aktionen, Architekturentscheidung Sales-channel business timezone und Release Notes 6.7.13.0; Symfony-Dokumentation, Clock-Komponente; Einheiten- und Zeitgesetz (EinhZeitG), § 4; Umsatzsteuergesetz (UStG), § 14; Abgabenordnung (AO), § 147; Bürgerliches Gesetzbuch (BGB), §§ 195 und 199; Bayerisches Feiertagsgesetz (BayFTG), Art. 1; Handelsverband Deutschland (HDE), Weihnachtsprognose vom 5. November 2025 sowie Pressemitteilung und Folien zur Weihnachtsprognose vom 3. November 2026. Kalenderdaten und Beispielausgaben wurden am 16. Oktober 2026 mit PHP 8.5 und MariaDB 11.8 nachgerechnet.

Verwandte Artikel

Wartung & Updates

Zeitumstellung 25.10.: Cronjobs und Zeitstempel im Shop

Am 25. Oktober 2026 erscheint die Stunde von 2 bis 3 Uhr zweimal. Was das für Cronjobs, Zeitstempel und Tagesberichte im Shop bedeutet und wie man vorsorgt.

15 Min. Lesezeit
Sicherheit

Penetrationstest für den Shop: wann er sich wirklich lohnt

Scan oder Penetrationstest? Wann sich der Test für Onlineshops lohnt, wie Umfang und Testumgebung stehen und wie Befunde bis zum Nachtest abgearbeitet werden.

20 Min. Lesezeit
Wartung & Updates

WordPress-Sicherheitsupdates: Was alte Zweige noch bekommen

WordPress 7.1.2 schloss eine kritische Lücke, der Fix kam als Gefälligkeit bis 4.7 zurück. Was ältere Zweige erhalten, was nicht und wann der Sprung fällig ist.

20 Min. Lesezeit