Sicher sind Sie sicher, dass einige - wenn nicht alle - dieser Aussagen immer und überall zutreffen:
- Es gibt immer 24 Stunden am Tag.
- Eine Woche beginnt und endet immer im selben Monat.
- Eine Woche (oder ein Monat) beginnt und endet immer im selben Jahr.
- Die Zeit hat keinen Anfang und kein Ende.
- Ein Monat kann 28, 29, 30 oder 31 Tage dauern.
- Alle 4 Jahre gibt es ein Schaltjahr.
- In jedem Monat ist die Anzahl der Tage überall gleich.
- Der Server und der Client haben immer die gleiche Zeit.
- Sie können die Anzahl der Stunden und Minuten ab einem bestimmten Zeitpunkt einfach berechnen.
- Jede Minute hat 60 Sekunden.
Obwohl die Praxis zeigt, dass es eine Täuschung ist, sich bei der Entwicklung von Software auf die Wahrheit dieser Aussagen zu verlassen. Okay, nicht alle diese Punkte sind Missverständnisse . Einige der Aussagen wären wahr, wenn nicht die lästigen Fehler und Randfälle, die sich in der Geschichte der Software unzählig angesammelt haben.
Jede Minute hat 60 Sekunden und es gibt immer 24 Stunden an einem Tag
In älteren Versionen von KVM in CentOS gab es beispielsweise einen merkwürdigen Fehler - eine Minute konnte so lange dauern, wie Sie möchten. Tatsache ist, dass KVM nicht wusste, dass es nicht auf physischer Hardware ausgeführt wird. Wenn das Hosting-Betriebssystem die virtuelle Maschine vorübergehend angehalten hat, wurde die virtualisierte Uhr von dem Moment an weiter ausgeführt, an dem sie angehalten wurde . Wenn beispielsweise ein Auto um 13:00 Uhr angehalten und um 15:00 Uhr aktiviert wurde, zeigte die darin enthaltene Systemuhr weiterhin 13:00 Uhr an. Infolgedessen gab es nach jeder Pause eine Diskrepanz mit der Echtzeit. Es gab sogar eine Cron-Aufgabe, die eingerichtet werden konnte, um die virtualisierte Uhr mit der Hardware-Uhr zu synchronisieren. Aber beim Erstellen einer neuen virtuellen Maschine war es leicht, sie zu vergessen, und es hat Spaß gemacht. Der Fehler wurde später behoben.
Abgesehen von den Fehlern gibt es auch eine Schaltsekunde (zusätzliche) Sekunde: Sie wird am Ende des Tages am 30. Juni oder 31. Dezember zu UTC (Coordinated Universal Time) hinzugefügt, um die allmähliche Verlangsamung der Erdrotation und zu kompensieren die Anhäufung der Differenz zwischen dem SI und den astronomischen Tagen. - sonnig - für Tage.
Was die Länge des Tages betrifft, so ist der Hauptfeind des Programmierers der Übergang zur Sommerzeit, die irgendwo da ist, wo sie nicht ist, und früher könnte sie abgebrochen oder eingeführt werden. Dies ist ein separates großes Problem mit historischen Daten - Sommerzeit.
Und wenn wir noch die Änderung der Zeitzonen hinzufügen ...
Über Wochen, Monate und Jahre
Aber Geschichten über unterschiedliche Längen von Monaten und Jahren sind mit unterschiedlichen Kalenderberechnungen für verschiedene Völker der Welt verbunden. Zum Beispiel arbeitet der hebräische Kalender mit Mondmonaten: Das heißt, der Anfang und das Ende des Monats sind an die Mondphasen gebunden. Denken Sie, dass Sie dies leicht berücksichtigen können, indem Sie eine Anpassung für Israel mit dem Laden der Mondphasen hinzufügen? Wird nicht funktionieren. In einem jüdischen Schaltjahr wird ein zusätzlicher Monat hinzugefügt . Darüber hinaus - achten Sie auf Ihre Hände - können sowohl einfache als auch Schaltjahre im hebräischen Kalender drei verschiedene Längen haben . Insgesamt kann ein Jahr sechs verschiedene Längen haben.von 354 bis 383 Tagen. Denken Sie, hier haben die Unterschiede zu unserem Kalender geendet? Wo es gibt: Im jüdischen Kalender haben Tage unterschiedliche Dauer und werden von Sonnenuntergang zu Sonnenuntergang gezählt (formal, wenn drei Sterne am Himmel sichtbar werden).
Denken Sie, dass nur für die Juden nicht alles wie im Gregorianischen Kalender ist (zur Frage der großen sozialistischen Oktoberrevolution, die am 7. November in der UdSSR gefeiert wurde)? In arabischen Ländern:
- Die Woche beginnt nicht am Montag, sondern am Sonntag.
- Das Wochenende gilt als Freitag und Samstag und in einigen Ländern als Donnerstag und Freitag. In den letzten 10 Jahren haben einige Staaten das Wochenende auf Freitag und Samstag verschoben, um den internationalen Handel zu erleichtern. Und doch haben nicht alle arabischen Länder ein Wochenende von zwei Tagen.
- Religiöse Feiertage hängen von Beobachtungen des Mondzyklus ab, so dass ihr Zeitpunkt nicht genau vorhergesagt werden kann.
Die Tatsache, dass Wochen und Monate im nächsten Jahr enden können, ist wiederum typisch für Länder mit Mond- und Sonnen-Mond-Kalendern - in diesen beginnt das neue Jahr nicht am 1. Januar. Auf Anhieb können Sie sich sofort an die Chinesen erinnern, deren neues Jahr nach dem Gregorianischen Kalender vom 21. Januar bis 21. Februar beginnt. Und im äthiopischen Kalender ist das neue Jahr in der Regel der 29. oder 30. August, und selbst die Anzahl der Jahre, die sie haben, ist 8 weniger als im System "seit der Geburt Christi".
Der Server und der Client haben immer die gleiche Zeit
Und hier ist eine interessante Tatsache, aufgrund derer die Zeit auf verschiedenen Computern nicht nur nicht zusammenfällt, sondern auch die Größe der Diskrepanz variieren kann. Wenn Linux hochfährt, nimmt es die aktuelle Hardwarezeit in Anspruch und zählt sie dann weiter herunter, wobei Daten von der internen Prozessortakt (TSC) hinzugefügt werden. Diese Uhren können sehr ungenau sein. Zum Beispiel aufgrund der Taktskalierung, die die TSC-Frequenz dynamisch ändert. Und wenn Sie die Taktfrequenz auf dem Host ändern, werden sie nicht einmal von allen Gastkonten bemerkt. Wenn Sie die TSC-Frequenz um 50% skalieren, beginnt die Zeit doppelt so langsam zu laufen. Darüber hinaus kann das BIOS auf einigen Servern die Prozessorfrequenz skalieren, ohne das Betriebssystem zu benachrichtigen, wodurch auch ein Fehler hinzugefügt wird. Auf neueren Prozessoren sind die TSC-Frequenzen jetzt festgelegt. Windows verwendet übrigens kein TSC, daher hat dieses Betriebssystem andere Probleme mit dem Timing:)
Sie können die Anzahl der Stunden und Minuten ab einem bestimmten Zeitpunkt einfach berechnen
Wenn die Programmiersprache nicht so etwas wie Python enthält
tzinfo()
, können Sie kein bestimmtes Datum und keine bestimmte Uhrzeit ermitteln, indem Sie einfach Stunden und Minuten zu einem Datum in der Vergangenheit hinzufügen. Es ist notwendig, die Zeitzonen (und ihre möglichen Änderungen, wie sie mehr als einmal in der Geschichte aufgetreten sind) zu berücksichtigen und dann alle Änderungen beim Übergang zur Sommerzeit zu berücksichtigen ... In Windows ist dies im Allgemeinen unmöglich. weil Microsoft nur den Anfang und das Ende des laufenden Jahres bereitstellt. Überraschenderweise hat das Unternehmen nach so vielen DST-Patches immer noch kein Windows-Äquivalent implementiert
tzinfo()
. Wahrscheinlich nicht.
Die Zeit hat keinen Anfang und kein Ende
"Ihr Programm muss niemals Daten vor 1970 verarbeiten." Auf Unix-Systemen (einschließlich Linux und iOS) wird die Zeit seit 00:00:00 am 1. Januar 1970 UTC (Coordinated Universal Time) in Sekunden gezählt. Alles, was früher in Unix war, wird bereits eine negative Zeit sein. Darüber hinaus wird die Zeit in einem 32-Bit-Ganzzahlausdruck dargestellt, und das früheste in Unix-Systemen mögliche Datum ist der 13. Dezember 1901. Und die "Top" -Unix-Zeit ist auf den 19. Januar 2038 begrenzt, wenn die Anzahl der Sekunden ab dem Beginn des Countdowns 2 31 erreicht und diese Anzahl vom System als negativ angesehen werden kann.
All dies ist nur ein kleiner Teil der Vielzahl von Nuancen und Fehlern, mit denen Entwickler eines zeitaufwändigen Produkts fertig werden müssen. Sicherlich haben Sie auch eine Geschichte aus Ihrer Erfahrung zu erzählen, schreiben Sie in die Kommentare.