Microsoft hat gerade angekündigt, dass ein Softwarefehler bei der Berechnung der Daten (über das Schaltjahr) letzte Woche einen großen Ausfall in Windows Azure verursacht hat .
War es wirklich ein einfacher Fehler bei der Beurteilung DateTime.Now.AddYears(1)
eines Schaltjahres?
Welche Codierungspraktiken hätten dies verhindern können?
EDIT
Wie dcstraw wies darauf hin , DateTime.Now.AddYears(1)
auf einem Schaltjahr ist in der Tat das richtige Datum in .NET zurückzukehren. Es handelt sich also nicht um einen Framework-Fehler, sondern offensichtlich um einen Fehler bei der Datumsberechnung.
Antworten:
Schamloser Stecker:
Verwenden Sie eine bessere Datums- und Uhrzeit-API
Die integrierten .NET-Datums- und Zeitbibliotheken sind fürchterlich schwer zu verwenden. Sie tun können Sie alles tun , was Sie brauchen, aber Sie können nicht ausdrücken , sich klar durch das Typsystem.
DateTime
ist ein Chaos ,DateTimeOffset
kann Sie in den Gedanken wiegen, dass Sie die Zeitzoneninformationen tatsächlich beibehalten, wenn Sie dies nicht tun, undTimeZoneInfo
zwingt Sie nicht dazu, über alles nachzudenken, was Sie in Betracht ziehen sollten.Keines davon bietet eine gute Möglichkeit, "nur eine Tageszeit" oder "nur ein Datum" zu sagen, und sie unterscheiden auch nicht klar zwischen "Ortszeit" und "Zeit in einer bestimmten Zeitzone". Und wenn Sie einen anderen Kalender als den Gregorianischen verwenden möchten, müssen Sie
Calendar
die ganze Zeit durch die Klasse gehen .All dies ist der Grund, warum ich Noda Time erstelle - eine alternative Datums- und Zeitbibliothek, die auf einem Port der Joda Time "Engine" basiert, aber eine neue (und schlankere) API enthält.
Einige Punkte, über die Sie nachdenken sollten, die leicht zu übersehen sind, wenn Sie sich ihrer nicht bewusst sind:
TimeZoneInfo
allgemein offengelegt werden kann. (Es wird keine Zeitzone unterstützt, deren Vorstellung von "Standardzeit" sich im Laufe der Zeit ändert oder die in die permanente Sommerzeit übergeht.)Soweit spezifische Entwicklungspraktiken:
DateTime.Now
oderDateTime.UtcNow
; es macht den Unit-Test einfacher (machbar!)quelle
Es ist erwähnenswert, dass der Fehler wahrscheinlich nicht auf eine Zeile zurückzuführen ist, wie Sie sie gepostet haben:
Das schafft kein ungültiges Datum. Wenn du läufst:
Sie erhalten den 28. Februar 2013. Ich weiß nicht, in was Azures Gastagent geschrieben ist, aber es muss ein anderer Anruf gewesen sein, der fehlgeschlagen ist. Ein schlechter Weg, dies in .NET zu tun, wäre gewesen:
Das löst eine Ausnahme aus, wenn
today
Schalttag ist. Im Microsoft-Blog zum Azure-Problem wurde jedoch angegeben, dass ein ungültiges Datum vom 29. Februar 2013 erstellt wurde. Ich bin mir nicht sicher, ob diesDateTime
in .NET möglich ist.Ich sage das nicht
DateTime
und bin nichtDateTimeOffset
fehleranfällig, nur dass ich nicht glaube, dass sie dieses spezielle Problem verursacht hätten.quelle
Das Testen von Daten für bestimmte Daten, wie John erwähnte, ist eine Code-Praxis, die hilft, aber nichts geht über das, was ich als "manuellen Integrationstest" definiere.
Ändern Sie die Uhr auf Ihrem Entwicklungs- / Testbed-Server und beobachten Sie, was passiert, wenn die Zeit abläuft.
Machen Sie sich keine Gedanken darüber, ob dies eine „Codierungspraxis“ ist. Natürlich können Sie dies nicht für jedes Datum im Kalender tun. Wählen Sie die Daten aus, mit denen Sie sich befassen, sei es am 29. Februar, Ende des Monats Daten oder Sommerzeit-Umstellungstermine.
quelle