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