Christian Seiler: Neues Projekt: Erweiterte Datums- und Zeitberechnung in PHP

Hallo Forum,

Ich sitze schon einige Zeit an einem neuen Projekt von mir. Es handelt sich um eine Sammlung von Klassen für PHP, die es ermöglichen, Datums- und Zeitberechnungen durchzuführen. Nunja, stellt sich die Frage, was daran so besonders sein soll, PHP bietet selbst bereits derartige Funktionen an. Deswegen erst einmal eine Liste mit Dingen, die mein Projekt kann:

- Unterstützung für unterschiedliche Kalendersysteme. Von Haus aus werden der gregorianische und julianische Kalender unterstützt, es ist aber problemlos möglich, andere Kalender zu nutzen, ohne die Basisklassen zu modifizieren, sofern jemand den Code dazu schreibt. Ich habe bereits ein Plugin für den hebräischen Kalender geschrieben (das Konzept eines Lunisolarkalenders hat mich fasziniert) - allerdings sollte sich das jemand mit hinreichend Ahnung auf dem Gebiet evtl. nochmal ansehen, ich garantiere da nicht für die Richtigkeit. Auf meiner Liste der Kalendersysteme, die ich gerne noch implementieren würde, stehen noch die islamischen Kalender (reine Mondkalender) und der chinesische Kalender (auch ein Lunisolarkalender).

- Großer Bereich an möglichen Daten, die abgedeckt werden. Das kleinstmöglich darstellbare Datum ist der 1. Januar 4713 v.u.Z. JC, das größtmögliche Datum wird durch die maximale Größe einer ganzen Zahl beschränkt; auf 32bit-Systemen wäre das der 31. Dezember des Jahres 5874897 GC.

- (Portable) Unterstützung von unterschiedlichen Zeitzonen. Unter http://www.twinsun.com/tz/tz-link.htm gibt es eine Datenbank, die Informationen über unterschiedliche Zeitzonen und Sommerzeitwechsel etc. enthält. Es ist die gleiche Datenbank, wie sie auch unter verschiedenen UNIX-Betriebsystemen verwendet wird (Zoneinfo). Mein Projekt enthält ein Script, das die Datenbank parst und in lauter .php-Dateien (für jede Zeitzone eine) verwandelt, die dann die nötigen Informationen enthalten, um die Zeitzone korrekt darzustellen. Es werden auch einige subtilere Dinge unterstützt. Zum Beispiel wird erkannt, ob ein Datum ungültig in der entsprechenden Zeitzone ist (wie z.B. 2007-03-25 02:30:00 bei uns nicht erlaubt ist) - und auch, ob ein Datum doppelt auftritt (wie z.B. 2006-10-29 02:30:00 - gibt es in unserer Zeitzone einmal als 2006-10-29 02:30:00 + 02:00 und einmal eine Stunde später als 2006-10-29 02:30:00 +01:00).

- Unterstützung von Schaltsekunden. Wenn man auf das Datum 1972-06-31 00:59:59 +01:00 zwei Sekunden addiert, landet man bei 1972-07-01 01:00:00 +01:00, denn es befindet sich eine Schaltsekunde 1972-06-31 00:59:60 +01:00 dazwischen. Das kann wahlweise auch deaktiviert werden.

- Möglichkeit der Lokalisierung der Datumsausgabe unabhängig vom Betriebsystem. Allerdings wird bisher nur US-Englisch unterstützt.

Ich bin noch nicht ganz fertig mit dem, was ich mir vorgenommen hatte. Einige Dinge (insb. das Parsen von Strings / das Formatieren eines Datums als String) gefallen mir noch nicht so recht und ich wäre da über Verbesserungsvorschläge sehr erfreut. Außerdem gibt es noch Dinge, die ich gerne umsetzen würde, z.B. die Möglichket, "sprechende" Intervalle zu benutzen, etwa wie "addiere auf das Datum 1 Jahr und 5 Tage" oder ähnliches. Aber ich dachte, es wäre gut, vorher erst einmal ein paar andere Meinungen zum Projekt zu hören.

Das einzige Problem ist, dass das Projekt noch gar nicht dokumentiert ist. Ich habe hier mal ne kurze Demo-Datei geschrieben: http://www.christian-seiler.de/projekte/php/cxdate/demo/demo.php, damit man erahnen kann, was alles möglich ist.

Wer sich das, was es jetzt bereits gibt, schon mal herunterladen und ausprobieren will: [ZIP], [TAR.GZ], [TAR.BZ2]

Ich will das ganze Projekt später unter der MIT-License veröffentlichen (So gut wie gar nicht restriktiv, vergleichbar mit BSD ohne Advertising Clause, GPL-kompatibel). Der einzige Teil, den ich unter einer anderen Lizenz veröffentliche, ist das Script, das die Zeitzonen-Datenbank parst, das habe ich nämlich größtenteils von Perls DateTime::TimeZone::OlsonDB portiert, das habe ich, um mir keine Gedanken machen zu müssen, einfach unter die gleiche Linzenz, wie das Perl-Zeugs gestellt. Sollte aber kein Problem sein, das Script selbst interessiert wohl die wenigsten; die Ausgabe davon ist ja entscheidend.

Nunja, wie auch immer, wenn man die obigen Dateien entpackt, erhält man mehrere Verzeichnisse: lib/, tests/ und tools/. In lib/ sind die ganzen Klassen drin, die braucht man, wenn man das Projekt verwenden will. In tests/ sind einige Unit-Tests drin (das will ich noch erweitern) - die Unit-Tests funktionieren allerdings nur mit PHP5, da ich phpUnit2 verwende (der Rest sollte auch mit PHP4 funktionieren, hab's aber nicht explizit getestet). In tools/ ist im Moment nur das Script tzdb-parse.php - damit kann man die Zeitzonen-Datenbank verarbeiten. Braucht man im Normalfall auch nicht, die Datenbank biete ich auch konvertiert zum Download an.

Die eigentliche Zeitzonen-Datenbank (Version 2006l) habe ich konvertiert und stelle sie sowohl als Gesamtpaket, als auch in Teilen zum Download zur Verfügung. Die Inhalte müssen nach lib/CXDate/zoneinfo entpackt werden.

Alle Zeitzonen: [ZIP], [TAR.GZ], [TAR.BZ2]

Einzelne Pakete (»base« + »etcetera« + evtl. alle zusätzlich benötigen Pakete nach lib/CXDate/zoneinfo entpacken; in »backwards« sind nur Links auf andere Zeitzonen drin, da funktionieren natürlich nur die, bei denen das Link-Ziel auch existiert):

base: [ZIP], [TAR.GZ], [TAR.BZ2]
etcetera: [ZIP], [TAR.GZ], [TAR.BZ2]

africa: [ZIP], [TAR.GZ], [TAR.BZ2]
antarctica: [ZIP], [TAR.GZ], [TAR.BZ2]
asia: [ZIP], [TAR.GZ], [TAR.BZ2]
australasia: [ZIP], [TAR.GZ], [TAR.BZ2]
backward: [ZIP], [TAR.GZ], [TAR.BZ2]
europe: [ZIP], [TAR.GZ], [TAR.BZ2]
northamerica: [ZIP], [TAR.GZ], [TAR.BZ2]
pacificnew: [ZIP], [TAR.GZ], [TAR.BZ2]
southamerica: [ZIP], [TAR.GZ], [TAR.BZ2]

Zum Abschluss nochmal der Grund meines Postings: Ich würde gerne Kommentare, Meinungen, Kritik zum Projekt hören. Falls noch Fragen sind, beantworte ich diese auch gerne. Eventuell hätte ja auch jemand Lust, daran mitzuarbeiten. Gerade, was Unit-Tests und Dokumentation angeht, wäre mir Hilfe sehr willkommen.

Achja, falls jemand einen besseren Vorschlag für den Titel des Projekts hat, bin ich natürlich auch offen für Vorschläge.

Viele Grüße,
Christian

  1. Hallo Christian,

    nur für mich zum Verständnis:

    Du glaubst, seit 1. Januar 4713 v.u.Z. sämtliche Zeitpunkte vom Ein- und Ausschalten der Sommer- und Winterzeit zu kennen?

    Und wann es Schaltsekunden gegeben hat?

    Kalle

    1. Hallo Kalle,

      Du glaubst, seit 1. Januar 4713 v.u.Z. sämtliche Zeitpunkte vom Ein- und Ausschalten der Sommer- und Winterzeit zu kennen?

      Nein. ;-) Nur wenn Du auch nur etwas in die Vergangenheit zurück gehst, werden Datumsangaben sowieso ziemlich ungenau, da damals das exakte Datieren nicht wirklich wichtig war. Und Sommer/Winterzeit gibt's eh nich so lange, früher hat man sich einfach nach der Sonne gerichtet und es gab nur ne Lokalzeit (der Offset zu UTC kann da auch sehr "krumm" sein, z.B. 2 Stunden, 23 Minuten und 12 Sekunden oder so). Ich nutze wie gesagt die Zeitzoneninformationen aus der Zeitzonendatenbank unter http://www.twinsun.com/tz/tz-link.htm - und die enthält auch historische Daten, ab dem Ende des 19. Jahrhunderts ca. Wie exakt die sind, kann ich nicht beurteilen, aber hast Du einen besseren Vorschlag, was ich nehmen soll, um frühere Uhrzeiten zu datieren?

      Und wann es Schaltsekunden gegeben hat?

      Ja. Es gab bisher nur 23 Schaltsekunden, und die sind mir alle bekannt. Schaltsekunden gibt's ja sowieso erst, seitdem es Atomzeit gibt (bzw. etwas später sogar, 1972-06-30T23:59:60+0000 war die erste Schaltsekunde, 2005-12-31T23:59:60+0000 die letzte bisher - schau Dir die Datei "leapseconds" der Zeitzonendatenbank an).

      Viele Grüße,
      Christian

      --
      "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
  2. hallo Christian,

    ich habs mir mal geholt und einen ersten flüchtigen Blick darauf geworfen. Trotz deiner Erläuterung verstehe ich immer noch nicht dein Motiv, "so etwas" zu basteln. Aber da ich mir das Ganze gründlich anschauen will, kanns passieren, daß ich zu einer "Kritik" erst dann in der Lage bin, wenn der Thread bereits archiviert ist.

    Übrigens gibt es ja Zeitgenossen, die meinen, in der Geschichtsschreibung seien tatsächlich so um die 200 Jährchen simuliert, etwa um die Zeit Karls des Großen herum, und real lebten wir also eigentlich erst im 19. Jahrhundert.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hallo Christoph,

      ich habs mir mal geholt und einen ersten flüchtigen Blick darauf geworfen. Trotz deiner Erläuterung verstehe ich immer noch nicht dein Motiv, "so etwas" zu basteln. Aber da ich mir das Ganze gründlich anschauen will, kanns passieren, daß ich zu einer "Kritik" erst dann in der Lage bin, wenn der Thread bereits archiviert ist.

      Du kennst ja meine E-Mail-Adresse. ;-)

      Übrigens gibt es ja Zeitgenossen, die meinen, in der Geschichtsschreibung seien tatsächlich so um die 200 Jährchen simuliert, etwa um die Zeit Karls des Großen herum, und real lebten wir also eigentlich erst im 19. Jahrhundert.

      Nunja, ich kenne diese Theorien auch, halte von ihnen aber nichts. Vor allem, da der Zeitgenosse, der das behauptet, ständig jemand anderen als Kopf der Verschwörung ausmacht (mal ist's der Papst, mal der Kaiser, mal irgend ein Bischof, mal sonstwer...) - irgendwie sehr unglaubwürdig.

      Viele Grüße,
      Christian

      --
      "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
      1. hallo Christian,

        da ich mir das Ganze gründlich anschauen will, kanns passieren, daß ich zu einer "Kritik" erst dann in der Lage bin, wenn der Thread bereits archiviert ist.
        Du kennst ja meine E-Mail-Adresse. ;-)

        Ja - nur hätte dann das Forum nix mehr davon. Also gut, ich beeile mich, herauszufinden, warum _du_ dir diese doch ziemlich umfangreiche Projektarbeit zugemutet hast und was sie dann _mir_ vielleicht nutzen könnte. Im Moment sehe ich das noch nicht - ich sehe allerdings etliche recht interessante Scripts.

        Übrigens gibt es ja Zeitgenossen, die meinen, in der Geschichtsschreibung seien tatsächlich so um die 200 Jährchen simuliert
        Nunja, ich kenne diese Theorien auch, halte von ihnen aber nichts.

        Ich auch nicht. Es gab unlängst mal eine längere Darstellung in "Galileo" auf PRO7. Aber wenn wir schon über Datums- und Zeitprojekte reden, ist das eine vielleicht verwirrende, aber auch ganz nette Zutat. Bei den Dimensionen, die dein Projekt aufzuweisen scheint, wärs auch möglich, den präzisen Todestag des letzten Dinosauriers ausgeben zu lassen, sofern man den genauen C14-Wert seiner Knochen kennt. - Aber wie angegeben, ich versuche erstmal, dein Projekt zu verstehen.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
        1. Hallo Christoph,

          Bei den Dimensionen, die dein Projekt aufzuweisen scheint, wärs auch möglich, den präzisen Todestag des letzten Dinosauriers ausgeben zu lassen, sofern man den genauen C14-Wert seiner Knochen kennt.

          Och, da muss ich Dich in zweierlei Hinsicht enttäuschen. Zum einen (steht auch auf der von Dir verlinkten Seite) eignet sich die C14-Methode nur für recht junge Datierungen (55000 Jahre laut Wikipedia, ich hab einen ähnlichen Wert im Kopf), daher wird bei solchen Dimensionen (Dinosaurier) eher die sog. Kalium-Argon-Uhr verwendet (gleiche Methode wie C14, andere Elemente). Und zum anderen: Mein Projekt kann im Moment nichts unterhalb vom 1.1.4713 v.u.Z. JC darstellen - zu diesem Zeitpunkt waren die Dinosauer aber schon lange ausgestorben. ;-)

          Viele Grüße,
          Christian

          --
          "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
          1. hallo Christian,

            Mein Projekt kann im Moment nichts unterhalb vom 1.1.4713 v.u.Z. JC darstellen

            Schade. Damit fallen die ersten ägyptischen Pharaonengeschlechter schon raus, und eine exakte Datierung der Erstschrift des Gilgamesch-Epos auch *g*

            Inwieweit ist es denn zulässig, auf solche "alten" Perioden den Julianischen Kalender abzubilden? Die Zeitrechnung basierte bis ins dritte Jahrtausend v.u.Z. regional unterschiedlich oft auch auf dem Mondjahr.

            Grüße aus Berlin

            Christoph S.

            --
            Visitenkarte
            ss:| zu:) ls:& fo:) va:) sh:| rl:|
            1. Hallo Christoph,

              Inwieweit ist es denn zulässig, auf solche "alten" Perioden den Julianischen Kalender abzubilden?

              Die gleiche Frage kannst Du den Autoren von ISO 8601 stellen, die den gregorianischen Kalender auf vor-1582-Zeiten ausdehnen.

              Aber wenn ich in Geschichtsbüchern lese, dass Caesar am 12. oder 13. Juli 100 v.u.Z. geboren wurde, dann ist damit ja definitiv der julianische Kalender gemeint. Auch wenn der zu dem Zeitpunkt noch gar nicht gültig war. Und selbst der Kalender, den Caesar eingeführt hat, entspricht nicht dem julianischen Kalender, wie wir ihn kennen - der wurde erst in frühchristlicher Zeit so definiert. Insofern halte ich es durchaus für gerechtfertigt, den julianischen Kalender für solch frühe Daten zu verwenden, denn sie werden zumindest in westlichen Geschichtsbüchern auch überall so verwendet. Ich hätte übrigens auch nichts dagegen, wenn jemand einen tatäschlich damals genutzten Kalender implementiert.

              Viele Grüße,
              Christian

              --
              "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
  3. Ich sitze schon einige Zeit an einem neuen Projekt von mir. Es handelt sich um eine Sammlung von Klassen für PHP, die es ermöglichen, Datums- und Zeitberechnungen durchzuführen.

    Achja, falls jemand einen besseren Vorschlag für den Titel des Projekts hat, bin ich natürlich auch offen für Vorschläge.

    Zeitgeist.mod
    Viel Spass!