Schaltjahre
Ein leidiges Thema. Man könnte meinen es sei ganz einfach ein Schaltjahr zu berechnen: Lässt sich ein Jahr ohne Rest durch 400 teilen, dann ist es ein Schaltjahr, lässt es sich ohne Rest durch 4 teilen, dann ist es auch ein Schaltjahr, lässt es sich aber ohne Rest durch 100 teilen, ist es kein Schaltjahr. Daraus folgt, dass das Jahr 2000 ein Schaltjahr ist, die Jahre 1800 und 1900 z.B. sind aber keine Schaltjahre, da sie sich zwar ohne Rest durch 4 teilen lassen, aber (leider) auch ohne Rest durch 100.
Wie ich darauf komme über Schaltjahre zu schreiben? Ganz einfach: ich habe zur Zeit beruflich mit dieser Problematik zu kämpfen und musste dabei leider feststellen, dass einige Programme Schaltjahre falsch berechnen. Zugegeben, Datumsarithmetik ist kein einfaches Thema, doch Schaltjahre sind - wie ich oben gezeigt habe - nun wirklich nicht schwer zu berechnen.
Ein Negativbeispiel für die Schaltjahrberechnung ist das Linux Kommandozeilen-Tool cal und seine Abkömmlinge calendar, ncal und ccal. Für sie ist das Jahr 1700 fälschlicherweise ein Schaltjahr, wie auch das Jahr 1500. Das Jahr 1800 hingegen ist korrekterweise kein Schaltjahr. Ich weiß leider nicht wie sich dieser Fehler eingeschlichen haben kann und habe auch noch keinen Blick in den Quellcode geworfen, doch ich habe mir fest vorgenommen einen Bugreport einzureichen... wenn ich denn nur wüsste wo, denn das Tool cal hat wohl keine eigene Homepage. Falls also jemand eine Idee hat, wo man den Bug melden kann; ich bin für jede Hilfe dankbar.
Zur Prävention dieses unnötigen Fehlers hier noch ein Stück Code, wie man ein Schaltjahr korrekt berechnet:
bool isLeap(int year) { return ((year % 4) == 0) && (((year % 100) !=0) || ((year % 400) == 0)); }
Es ist C++-Code, sollte aber sehr leicht verständlich und schnell auf andere Programmiersprachen anwendbar sein.
