Schaltjahrproblem - Leap year problem

Das Schaltjahrproblem (auch als Schaltjahr-Bug oder Schalttag-Bug bekannt ) ist ein Problem sowohl für digitale (computerbezogene) als auch für nicht-digitale Dokumentations- und Datenspeicherungssituationen, die aus Fehlern bei der Berechnung von Schaltjahren resultieren Jahre , oder aus der Manipulation von Datumsangaben ohne Rücksicht auf den Unterschied zwischen Schaltjahren und gewöhnlichen Jahren.

Kategorien

Schaltjahr-Bugs lassen sich in der Regel in zwei Kategorien einteilen, basierend auf der Auswirkung, die sie in der Praxis haben können:

  1. Diejenigen, die zu Fehlerbedingungen führen, wie Ausnahmen, Fehlerrückgabecodes, nicht initialisierte Variablen oder Endlosschleifen
  2. Diejenigen, die zu falschen Daten führen, wie z. B. Off-by-One-Probleme bei Bereichsabfragen oder Aggregation

Beispiele

Python

Der folgende Python-Code ist ein Beispiel für einen Schaltjahrfehler der Kategorie 1. Es wird bis todayzum 29. Februar ordnungsgemäß funktionieren . Dann wird es versuchen, einen 29. Februar eines gemeinsamen Jahres zu erstellen, das nicht existiert. Der dateKonstruktor gibt a ValueErrormit der Meldung "Tag liegt außerhalb des zulässigen Bereichs für Monat" aus.

from datetime import date
today = date.today()
later = today.replace(year = today.year + 1)

Windows C++

Der folgende Windows C++-Code ist ein Beispiel für einen Schaltjahrfehler der Kategorie 1. Es wird bis stzum 29. Februar ordnungsgemäß funktionieren . Dann wird es versuchen, einen 29. Februar eines gemeinsamen Jahres zu erstellen, das nicht existiert. Die Übergabe an eine Funktion, die eine SYSTEMTIMEStruktur akzeptiert, wird wahrscheinlich fehlschlagen.

Der SystemTimeToFileTimehier gezeigte Aufruf gibt beispielsweise einen Fehlercode zurück. Da dieser Rückgabewert nicht markiert ist (was sehr häufig vorkommt), führt dies dazu, dass fter nicht initialisiert wird.

SYSTEMTIME st;
FILETIME ft;

GetSystemTime(&st);
st.wYear++;

SystemTimeToFileTime(&st, &ft);

Microsoft-C#

Der folgende .NET C#-Code ist ein Beispiel für einen Fehler der Kategorie 1 im Schaltjahr. Es wird bis dtzum 29. Februar ordnungsgemäß funktionieren . Dann wird es versuchen, einen 29. Februar eines gemeinsamen Jahres zu erstellen, das nicht existiert. Der DateTimeKonstruktor wirft eine ArgumentOutOfRangeException.

DateTime dt = DateTime.Now;
DateTime result = new DateTime(dt.Year + 1, dt.Month, dt.Day);

JavaScript

Der folgende JavaScript-Code ist ein Beispiel für einen Schaltjahrfehler der Kategorie 2. Es wird bis dtzum 29. Februar ordnungsgemäß funktionieren , z. B. am 29.02.2020. Dann wird versucht, das Jahr auf 2021 zu setzen. Da es den 29.02.2021 nicht gibt, wird das DateObjekt auf das nächste gültige Datum, den 01.03.2021, aktualisiert.

var dt = new Date();
dt.setFullYear(dt.getFullYear() + 1);

Schlechter Schaltjahralgorithmus (viele Sprachen)

Der folgende Code ist ein Beispiel für einen Schaltjahrfehler, der in vielen Sprachen auftritt. Je nachdem, wofür das Ergebnis verwendet wird, kann es zu Auswirkungen der Kategorie 1 oder der Kategorie 2 kommen. Sie geht fälschlicherweise davon aus, dass genau alle vier Jahre ein Schaltjahr auftritt.

bool isLeapYear = year % 4 == 0;

Der richtige Schaltjahr - Algorithmus wird bei erklärt Leap Year - Algorithmus .

Ereignisse

Es gab viele Vorkommen von Schaltjahr-Fehlern:

  • Microsoft Excel hat seit seinen frühesten Versionen 1900 fälschlicherweise als Schaltjahr betrachtet, und daher liegt der 29. Februar zwischen dem 28. Februar und dem 1. März dieses Jahres. Der Fehler stammt von Lotus 1-2-3 und wurde aus Gründen der Abwärtskompatibilität absichtlich in Excel implementiert . Microsoft hat einen Artikel über diesen Fehler geschrieben, in dem die Gründe für die Behandlung von 1900 als Schaltjahr erläutert werden. Dieser Fehler wurde in der Ecma Office Open XML (OOXML)-Spezifikation zu einer Anforderung hochgestuft.
  • 1996 kam es in zwei Aluminiumschmelzwerken in Tiwai Point , Neuseeland, und Bell Bay , Tasmanien, Australien, am 31. ohne Warnung. Die Computer waren nicht für den 366. Tag des Jahres programmiert. Die Reparaturkosten wurden auf mehr als 1 Million NZ$ geschätzt .
  • Am 31. Dezember 2008 um Mitternacht froren viele Zune 30- Modelle der ersten Generation ein . Microsoft erklärte , dass das Problem durch die interne Uhr verursacht wurde Treiber geschrieben von Freescale und die Art und Weise das Gerät behandelt ein Schaltjahr . Es reparierte sich automatisch 24 Stunden später, aber eine Zwischenlösung für diejenigen, die nicht warten wollten, bestand darin, den Akku des Geräts zu entladen und dann nach Mittag UTC am 1. Januar 2009 wieder aufzuladen .
  • Sonys PlayStation 3 behandelte 2010 fälschlicherweise als Schaltjahr, sodass der nicht vorhandene 29. Februar 2010 am 1. März 2010 gezeigt wurde und einen Programmfehler verursachte .
  • Im Jahr 2012 funktionierten die Satellitennavigationsgeräte von TomTom aufgrund eines Schaltjahrfehlers, der erstmals am 31. März auftrat, nicht mehr.
  • Im Jahr 2012 zeigte der Chatverlauf von Gmail für alle am 29. Februar gespeicherten Chats den 31. Dezember 1969 an .
  • Im Jahr 2012 wurde Microsoft Azure durch den Schaltjahr-Bug am 28. Februar offline genommen. Um 17:45 Uhr PST wurde das Windows Azure-Team auf ein Problem aufmerksam, anscheinend aufgrund einer falschen Zeitberechnung für das Schaltjahr.
  • Im Jahr 2016 wurde eine große Anzahl von Schaltjahrfehlern in der Liste der Schalttagsfehler 2016 auf der Website Code of Matt katalogisiert .
  • Ein Schaltjahresfehler in der Gepäckförderanlage des Düsseldorfer Flughafens führte am 29. Februar 2016 dazu, dass über 1.200 Gepäckstücke ihren Flug verpassten.
  • Im Jahr 2020 wurde eine große Anzahl von Schaltjahr-Fehlern in der Liste der 2020- Schalttagsfehler auf der Website Code of Matt katalogisiert .

Siehe auch

Verweise