Wie funktionieren Bibliotheken in verschiedenen Programmiersprachen Datum & Uhrzeit, Zeitstempel & Dauer, Leapseconds & -Jahre, DSTs & Timezones, …?

Gibt es ein Standard-Körper oder eine spezifische normative Art und Weise, wie zeitbezogene Dinge in der Praxis umgesetzt werden sollen (wie ICU für Unicode-bezogene Aufgaben) oder ist dies derzeit ein "Best-Effort", je nachdem wie viel Aufwand, Zeit- und Geldsprache Und Bibliotheks-Implementierer wollen ausgeben?

Gibt es eine konkrete und vollständige Umsetzung, die als Beispiel dafür dienen könnte, wie zeitbezogene Dinge behandelt werden sollten?

Welche vorhandene Bibliothek würdest du als schlecht ansehen, ein anständiges oder ein gutes Beispiel?

6 Solutions collect form web for “Wie funktionieren Bibliotheken in verschiedenen Programmiersprachen Datum & Uhrzeit, Zeitstempel & Dauer, Leapseconds & -Jahre, DSTs & Timezones, …?”

Ich werde versuchen, eine Antwort auf die zweite und dritte Frage mit der Java-Bibliothek zu geben, die Teil von Java 7 werden könnte.

Javax.time. * (JSR 310)

Diese Klassen sind eine komplette Umschreibung von JodaTime versuchen, die Design-Fehler von util.Date / util.Time sowie JodaTime zu beheben.

JSR 310 versucht, ein umfassendes Modell für Datum und Uhrzeit zu liefern, das typsicher und selbstdokumentierend ist. Es ist mit bestehenden Klassen interoperabel, berücksichtigt aber auch XML- und DBMS-basierte Anwendungsfälle. Die Klassen sind endgültig, unveränderlich, threadsicher und können nach dem Bau nicht verändert werden. Instanzen werden über einen reichen Satz von Factory-Methoden erstellt, die Dinge im Hintergrund zwischenspeichern können.

 LocalDate dateToday = LocalDate.of(2010, 9, 14); LocalDate oneMonthLater = dateToday.with(OCTOBER); LocalDate oneYearLater = dateToday.withYear(2011); 

Die API hat einige "maschinenorientierte" Klassen und einige "menschlich orientierte" Klassen:

Maschinenorientiert

Instant

Für einen Zeitpunkt, der mit einem Unix- oder Java-Zeitstempel vergleichbar ist. Tatsächlich gibt es Instant , TAIInstant und UTCInstant die es den Menschen ermöglichen, genau zu wählen, welche Definition von Zeit sie benötigen, dh "Tag-basiert", "linear, ohne Sprung Sekunden" etc.

Duration

Ein Zeitbereich, der nicht unbedingt mit einem bestimmten Datum oder Kalender verknüpft ist.

Menschlich orientiert

Es gibt eine reichhaltige Sammlung von Klassen, die verschiedene Gebrauchsfälle wie Date-only, Time-only, Time und Date, mit und ohne Timezones, mit und ohne DST behandeln.

DateProvider

OffsetDate , LocalDate (, java.sql.Date Kompatibilität)

TimeProvider

OffsetTime , LocalTime (, java.sql.Time Kompatibilität)

DateTimeProvider

ZonedDateTime , OffsetDateTime , LocalDateTime (, java.util.GregorianCalendar Kompatibilität)

InstantProvider

Instant , ZonedDateTime , OffsetDateTime (, java.util.Date Kompatibilität)

Period

Perioden stellen eine Zeitspanne wie "5 Tage" dar, die von einem Datum / einer Zeit hinzugefügt und subtrahiert werden kann.

Matcher

Matchers ermöglichen Abfragen wie "ist dieses Datum im Jahr 2006?" Oder "ist dieser Tag der letzte Tag dieses Jahres".

Adjuster

Adjuster kommen zur Rettung, wenn du komplexere Veränderungen machen möchtest, wie "Gib mir den letzten Tag des Monats!" Oder "Der zweite Dienstag nach Weihnachten, bitte!".

Resolver

Resolver erlauben den Benutzern zu definieren, was passieren soll, wenn ein bestimmtes Datum nicht gültig ist, wie am 31. Februar 2010:

 DateResolver previous = DateResolvers.previousValid(); LocalDate date = date(2010, 2, 30, previous); // date = 2010-02-28 

Arbeiten mit Timezone- und DST-Daten

Es ist möglich, diese Klassen zu serialisieren und sie entweder mit den aktuellen Zeitzonendaten oder den Zeitzonendaten zu deserialisieren, wenn sie serialisiert wurden. Darüber hinaus können Regeln aus verschiedenen Zeitzonen verglichen werden: Es ist möglich, herauszufinden, ob sich die DST-Regeln geändert haben, zB zwischen Version 2010e und 2010f für Termine in London oder Moskau und entscheiden, was getan werden soll, wenn eine Zeit in einer Lücke oder Überlappung ist.

Kalender-Systeme

Obwohl alles auf ISO-8601 basiert, werden einfache Kalender für Hebräisch, Hijrah, Japanisch, ThaiBuddist, etc. Zeitsysteme zur Verfügung gestellt.

Formatieren und Parsen

toString() liefert ISO8601 und Muster wie die in SimpleDateFormat und weiter fortgeschrittenen werden unterstützt.

Integration

  • Datenbanken
  • JodaTime
  • Legacy JDK Klassen ( java.util.* )
  • XML

Referenzen:

Es gibt Zeit (s) und es gibt Termine (Kalender)
Das erste Problem ist, dass die Daten nicht mit der Zeit verbunden sind, sondern mit der astronomischen Position von Earh, Moon usw. + Regelmäßigkeit / Periodizität der menschlichen Aktivität. Die Zeit ist auch subjektiv und relativ oder sogar relativistisch und entweder astronomisch oder atomar gemessen.

Die Zeitkörper und die Datums- / Kalenderorgane
Die Internationale Standartisierungsorganisation (ISO) [4] hat ausgestellt

  • "ISO 8601 Datenelemente und Austauschformate – Informationsaustausch – Darstellung von Datum und Uhrzeit" [4a]

Die, wie andere internationale Standards, Empfehlung ist und auf bereits etablierten Praktiken basiert.
Es ist (subjektiv) nur auf gregorianischen Kalender [5] und auf proleptischen (projiziert rückwärts zu gut, bevor es tatsächlich erfunden wurde, so ist von begrenztem Nutzen im Umgang mit historischen Daten) [5a].

Die Weltkalendervereinigung [1d] hat die Einführung des neuen Weltkalenders seit 2012 [1b-1d] initiiert, die nutzlos bereits vorhandene Bibliotheken machen würde. Wieder das gleiche Hauptproblem, siehe weiter weiter.

Die meisten Abdeckungen, die ich je gesehen habe, ist der Datum-Zeit-Vergleich in IT-Systemen [2] zwischen BIG8 DBMS (IBM DB2, Informix, Ingres, InterBase, Microsoft SQL Server, MySQL, Oracle und Sybase).
Diese und alle anderen Umfragen zeigen, dass die Verarbeitung derselben, zB die gregorianischen Kalenderzeit / Termine zwischen allen Systemen sowie innerhalb der gleichen Plattformen (zwischen verschiedenen Produkten und Versionen desselben Produkts) unterschiedlich ist, siehe z. , [3].

Das HAUPTPROBLEM mit allen Datums- / Zeitbibliotheken in allen Systemen, Frameworks ist, dass ihre Datums- / Zeit-Datentypen nicht erlauben, geographische und Kalenderinformationen in Datum / Zeit-Datentypen einzuschließen .
Ohne welche sind sie vorwiegend halb nutzlos – was ist der Sinn von Millisekunden in SQL Server datetime2 Werte im 7. Jahrhundert? Zu dieser Zeit gab es sogar keine Uhren, die die Zeit mit der Genauigkeit der Minuten messen (Galileo Galilei verwendet, z. B. sein Herz schlägt, um Zeitintervalle in seinen Experimenten zu messen) sowie Gregorianischer Kalender wurde nicht einmal erfunden.

So wird viel der Datetime-Typ-Raum missbraucht, der nicht die wichtigste Flexibilität der Arbeit mit Daten durch die Verknüpfung und Einbeziehung mit ihnen zu Geographie und / oder Kalender-Info zu geben.

Nur schnelle Abbildungen:

  • Das moderne Russland nutzt den gregorianischen Kalender und die russisch-orthodoxe Kirche nutzt den julianischen Kalender, durch den viele Staatsfeiertage in Russland bestimmt sind (z. B. Weihnachten in Russland ist am 7. Januar und das Alte Neujahr ist am 14. Januar vom Gregorianischen Kalender, während die Daten von Andere religiöse Feiertage schwimmen relativ zum gregorianischen Kalender).
  • In Vor-1917 Russland, Polen als seinen Teil, verwendet gregorianischen Kalender, während alle übrigen Russland verwendet Julian Kalender (mit schwimmenden Unterschied von 13-18 Tage in der "gleichen" Zeitzone) [5b];
  • Doppelklicken Sie auf die Uhr in MS Windows (oder öffnen Sie die Systemsteuerung -> Datum und Uhrzeit) -> Registerkarte Zeitzone -> Zeitzonen in Combobox anzeigen. Sie werden sehen, dass es 25 Stunden von GMT-12: 00 bis GMT + 13: 00 über hundert Zeitzonen mit Bruchstücken von Stunde wie GMT + 5: 00, GMT + 5: 30, GMT + 5: 45 usw .

==== Zitiert:
[1] Neuer Weltkalender
[1a] Update: Entschuldigen Sie, lesen Sie nicht [1a], Autor verwirrten Kalender und schrieb falsche Informationen in diesem News-Brief
Welt Kalender 2012: 35 Tage im Monat
http://www.panorama.am/de/society/2010/01/29/newcalendar
[1b] http://de.wikipedia.org/wiki/World_Calendar
[1c] http://www.theworldcalendarin2012.org/Index2.htm
[1d] http://www.theworldcalendar.org/TWCA.htm

[2] Peter Gulutzan, Trudy Pelzer. SQL Performance Tuning: Daten in SQL
http://www.informit.com/articles/printerfriendly.aspx?p=30939

[3] SqlDateTime.MinValue! = C # DateTime.MinValue, warum?
SqlDateTime.MinValue! = DateTime.MinValue, warum?

[4]
Internationale Standardisierungsorganisation
http://de.wikipedia.org/wiki/International_Organisation_for_Standardisierung
[4a] ISO 8601 Datenelemente und Austauschformate – Informationsaustausch – Darstellung von Datum und Uhrzeit
http://de.wikipedia.org/wiki/ISO_8601

[5]
Gregorianischer Kalender
http://de.wikipedia.org/wiki/Gregorian_calendar
[5a] Proleptischer gregorianischer Kalender
http://de.wikipedia.org/wiki/Proleptic_Gregorian_calendar
[5b] Gregorianische Kalenderannahme
http://de.wikipedia.org/wiki/Gregorian_calendar#Adoption
[6]
http://de.wikipedia.org/wiki/Galileo_Galilei

Ich glaube nicht, dass es im Moment einen einzigen Standard für solche Dinge gibt, aber es gibt mehrere Standards, die solche Dinge entsprechen können: ISO 8601 zum Beispiel.

ICUs eigene Datums- / Zeit-Handhabung ist eine Cross-Language (C / C ++ und Java) und Multi-Plattform-Bibliothek.

Es behandelt Termine und Zeiten intern, in der Regel für ein einziges Mal ein UDate (C / C ++) oder ein java.util.Date/long (Java), als Anzahl von Millisekunden seit 1-1-1970 oder ein Kalender-Objekt, das Ist spezifisch für die Art des Kalenders (Gregorian vs Hijri, etc.). Für die Formatierung stehen die Dauer zur Verfügung. Schaltjahre werden als Teil der Kalendersysteme berechnet, und es werden vorausgesetzt, dass Sekunden von dem zugrundeliegenden Betriebssystem gehandhabt werden. DST / Timezone Daten werden auf dem Laufenden gehalten mit 'die tz-Datenbank' manchmal auch durch den Nachnamen des Autors, Olson bezeichnet.

Hoffe, das hat Ihre Frage etwas in Bezug auf ICU beantwortet.

Ich habe es nicht in einer Weile benutzt, aber aus früheren Erfahrungen würde ich sagen, dass Boost.Date_Time ein ziemlich gutes Beispiel ist.

Während wahrscheinlich nicht die erste Wahl für viele schnelllebige Projekte heute, die ausdrucksvolle Kraft von C ++ scheint immer noch eine sehr gute Übereinstimmung für eine komplexe Problem-Domain wie Datum / Zeit, so kombiniert mit der qualitativ hochwertigen Peer-Review-Prozess zu übergeben, um ein Offizielle Boost C ++ – Bibliothek Ich würde hoffen, dass die Bibliothek zur Hand dienen könnte als Beispiel dafür, wie zeitbezogene Dinge behandelt werden sollten , wenn auch nicht als komplette Implementierung , siehe unten.

Boost Date Time

Die Bibliothek ist sehr gut dokumentiert, also könnte ich wohl die ganze Antwort aus Zitaten zusammenstellen, aber ich werde versuchen, einige Fragmente nach der Vorlage zu extrahieren, die durch die Antwort von soc vorgeschlagen wird – trotzdem werde ich mit einem ganzen Zitat beginnen:

Motivation

Die Motivation für diese Bibliothek kommt von der Arbeit mit und hilft, mehrere Datum-Zeit-Bibliotheken auf mehrere Projekte zu bauen. […]

Die Programmierung mit Datum und Uhrzeit sollte fast so einfach und natürlich sein wie die Programmierung mit Strings und Ganzzahlen. Anwendungen mit viel zeitlicher Logik können durch eine robuste Anzahl von Operatoren und Berechnungsmöglichkeiten radikal vereinfacht werden. Klassen sollten die Möglichkeit bieten, Datum und Uhrzeit zu vergleichen, Längen oder Zeitdauern hinzuzufügen, Datum und Uhrzeit von Uhren abzurufen und natürlich mit Datums- und Zeitintervallen zu arbeiten.

Domänenkonzepte

Die Bibliothek unterstützt 3 grundlegende temporale Typen:

  • Time Point – Spezifizierer für einen Ort im Zeitkontinuum.
  • Zeitdauer – Eine Zeitdauer, die an einem beliebigen Punkt des Zeitkontinuums ungebunden ist.
  • Zeitintervall – Eine Zeitdauer, die an einem bestimmten Punkt im Zeitkontinuum angehängt ist. Auch als Zeitraum bekannt.

Berechnungen

Sie erhalten einen ziemlich intuitiven Überblick darüber, wie sich die Domänenkonzepte im Abschnitt Details – Berechnungen beziehen.

Einschränkungen

Ein wichtiger Teil meiner ursprünglichen Entscheidung, die Bibliothek zu bewerten, war die vorhandene Dokumentation von Design-Zielen und notwendigen Kompromissen im Lichte der komplexen Problem-Domain, die die reale Welt-Kompetenz, die in die Bibliothek gesetzt wurde, zu skizzieren scheint – Sie können mehr lesen Darüber in den folgenden zwei Abschnitten:

  • Designziele
  • Kompromisse: Stabilität, Vorhersehbarkeit und Approximationen

Arbeiten mit Timezone- und DST-Daten

Es gibt volle Unterstützung für alle Arten von Berechnungen und Umbauten, von denen man denken kann, soweit es mich betrifft – siehe die Überschriften im Abschnitt Beispiele für einen ersten Eindruck.

Kalender- / Zeitsysteme

Dies ist definitiv der Schwachpunkt in Bezug auf Ihre Spezifikation, trotz der Bibliothek, die speziell mit Erweiterbarkeit im Auge entworfen wurde:

Ein großer Teil der Entstehung dieser Bibliothek war die Beobachtung, dass nur wenige Datum-Zeit-Bibliotheken in einer Weise gebaut werden, die Anpassung und Erweiterung ermöglicht. Ein typisches Beispiel, die Kalenderlogik wird direkt in die Datumsklasse eingebaut. Oder die Uhrzeitabruffunktionen werden direkt in die Zeitklasse eingebaut. Diese Designentscheidungen machen es in der Regel unmöglich, das Bibliotheksverhalten zu erweitern oder zu verändern. Auf einer fundamentaleren Ebene gibt es gewöhnlich Annahmen über die Auflösung der Zeitdarstellung oder den gregorianischen Kalender.

Jedoch bin ich nicht bewusst von irgendwelchen Implementierungen von anderen Kalender / Zeit-Systemen als die eingeschlossenen, siehe Bibliotheksreferenz für die gegenwärtigen Implementierungen von:

  • Terminzeit
  • Gregorianischen
  • Posix Zeit
  • Ortszeit

Formatieren und Parsen

Dies ist voll unterstützt und einer der starken Punkte der Bibliothek aufgrund der jeweiligen Leistung des zugrundeliegenden C ++ I / O-Systems, siehe Datum Zeit Input / Output – die Stream-orientierte C ++ I / O hat sowohl Verdienst als auch Probleme je nach Ihren Bedürfnissen Und Erwartungen, aber dieses Thema wird an anderer Stelle auf dieser Seite besprochen.

Integration

Dies wird auch durch Kompatibilität mit Boost Serialization , die archivorientiert ist, aber in der Regel bedeutet eine Datei von binären Daten, Textdaten, XML oder so; Dh Datenbanken werden nicht explizit wie in Ihrem JSR 310 Beispiel unterstützt.

Sie erwähnen Python in einem früheren Kommentar.

Python's builtin datetime support (docs) ist ziemlich praktisch, aber du musst eine Drittanbieter-Zeitzone Datenbank wie pytz (docs) verwenden , um es in der Nähe zu vervollständigen. Und, wie die pytz docs erwähnen, können Sie immer noch Probleme mit Hinzufügen Deltas zu Zeiten rechts um DST Übergänge, wenn Sie nicht vorsichtig sind.

Es war einmal der Fall, dass eGenix's mx.DateTime war der Weg zu gehen, wenn datetime nicht tun, es für Ihre Anwendung, vor allem für String zu Zeitstempel Conversions, aber Dateutil scheint beliebt zu sein in diesen Tagen (ich habe es aber nicht verwendet) .

Um Ihre "Good Example" Frage zu beantworten, werfen Sie einen Blick auf Noda Time – Jon Skeets Port der Joda-Time Bibliotheken für Java zu .Net

  • Schlechte Mikrosekundenauflösung in Python
  • Wie bekomme ich die Sekunden seit der Epoche aus der Zeit + Datum Ausgabe von gmtime () in Python?
  • Wie gewartet man etwas Zeit im Pygame?
  • Holen Sie sich aktuelle Zeit in Millisekunden in Python?
  • Statepace.SARIMAX-Modell: Warum das Modell alle Daten verwenden, um den Modus zu trainieren, und die Vorhersage der eine Reihe von Zug-Modell
  • Nicht in der Lage, "00:30 Uhr" zu 24 Stunden von strptime python umzuwandeln
  • Python: Wie bekomme ich UTC Zeit gegeben TIMEZONE
  • Von: "Vor 1 Stunde", Zu: Timedelta + Genauigkeit
  • Time.sleep - schläft Faden oder Prozess?
  • Was ist die höchste Zeit der Präzision, die über Python erreicht werden kann?
  • Time.time vs. timeit.timeit
  • Python ist die beste Programmiersprache der Welt.