Funktionierende Beispiele
In diesem Kapitel werden wir verschiedene zusätzliche Funkionen beschreiben welche auch
durch Zend_Date verfügbar sind. Natürlich haben alle beschriebene
Funktionen auch Beispiele um die Arbeitsweise, und die einfache API für
die richtige Benutzung von Ihnen, zu zeigen.
Prüfen von Daten
Normalerweise werden die meisten Daten als Zeichenketten übergeben. Aber das Problem
mit Zeichenketten ist das man nicht sicher sein kann ob eine Zeichenkette ein echtes
Datum enthält. Hierfür gibt es in Zend_Date eine eigene
statische Funktion um Datums-Zeichenketten zu prüfen.
Zend_Locale hat eine eigene Funktion
getDate($date, $locale) welche ein Datum analysiert und
die gültigen normalisierten Datumsabschnitte zurück gibt. Ein Monatsname wird zum
Beispiel erkannt und anschließend nur die Nummer des Monats zurück gegeben. Aber da
Zend_Locale nichts über Daten weiß, da es eine Klasse zum
Normalisieren und Lokalisieren ist, haben wir eine eigene Funktion
isDate($date) integriert welche das für uns prüft.
isDate($date, $format, $locale) nimmt bis zu drei Parameter
entgegen und benötigt mindestens einen Parameter. Deshalb ist alles was wir für das
Prüfen eines Datums benötigen natürlich das Datum selbst als Zeichenkette. Der zweite
Parameter kann das Format sein, in welchem das Datum erwartet wird. Wenn kein Format
angegeben wurde, wird das Standardformat des verwendeten Gebietsschemas benutzt. Für
Details darüber wie Formate aussehen müssen kann im Kapitel über
selbst definierte Formate
nachgeschaut werden.
Der dritte Parameter ist auch optional genauso wie der zweite Parameter und kann
verwendet werden um ein Gebietsschema anzugeben. Das gebietsschema wird benötigt um
Monats- und Wochentagsnamen zu normalisieren. Mit dem dritten Parameter sind wir also in
der Lage Daten zu erkennen wie '01.Jänner.2000' oder
'01.January.2000' abhängig von dem angegebenen Gebietsschema.
isDate() prüft natürlich auch ob ein Datum existiert.
Zend_Date selbst prüft die Daten nicht. Deshalb ist es möglich
ein Datum wie zum Beispiel '31.Februar.2000' mit
Zend_Date zu erstellen weil Zend_Date das
Datum automatisch korrigiert und ein gültiges Datum zurück gibt. In unserem Fall den
'03.März.2000'. Auf der anderen Seite führt
isDate() diese Prüfung durch und gibt beim
'31.Februar.2000' FALSE zurück, weil sie weiß
das dieses Datum unmöglich ist.
Prüfen von DatenSonnenaufgang und SonnenuntergangZend_Date beinhaltet auch Funktionen um Informationen von der
Sonne zu erhalten. Oft ist es notwendig die Zeit für Sonnenaugang oder Sonnenuntergang
für einen bestimmten Tag zu erhalten. Das ist mit Zend_Date sehr
einfach weil nur der gewünschte Tag angegeben werden muß, und zusätzlich die Ortsangabe
für den Sonnenaufgang oder Sonnenuntergang berechnet werden soll.
Da die meisten Personen die genaue Ortsangabe Ihrer Stadt nicht kennen haben wir auch
eine Helferklasse spendiert die für etwa 250 Haupt- und Großstädte der ganzen Welt die
Daten der Ortsangaben bereithält. Die meisten Personen können Städte in Ihrer näheren
Umgebung benutzen, da die Differenz für Ortsangaben welche nahe beineinander liegen nur
in Sekunden gemessen werden kann.
Für die Erstellung einer Auswahlbox und der Auswahl einer speziellen Stadt kann die
Funktion Zend_Date_Cities::getCityList() benutzt werden. Sie
gibt die Namen aller verfügbaren vordefinierten Städte der Helferklasse zurück.
Alle verfügbaren Städte ausgeben
Die Ortsangabe selbst erhält man mit der Funktion
Zend_Date_Cities::city(). Sie akzeptiert den Namen einer Stadt
wie durch die Funktion Zend_Date_Cities::getCityList()
angegeben und optional als zweiten Parameter den zu setzenden Horizont.
Es gibt 4 vordefinierte Horizonte welche mit einer Ortsangabe benutzt werden können um
den genauen Zeitpunkt von Sonnenauf- und -untergang zu erhalten. Der
'$horizon' Parameter ist in allen Funktionen immer optional. Wenn er
nicht gesetzt wird, wird der 'effective' Horizont benutzt.
Arten von unterstützten Horizonten für Sonnenauf- und -untergangHorizontBeschreibungVerwendungeffectiveStandard Horizont
Nimmt an das die Welt ein Ball ist. Dieser Horizont wird immer benutzt
wenn keiner definiert wurde.
civilÜblicher HorizontOft in den üblichen Medien wie Fernsehen und Radio benutzt.nauticNautischer HorizontOft in der Navigation zu See benutzt.astronomicAstronomischer HorizontOft bei der Berechnung mit Sternen benutzt
Natürlich kann auch eine selbst-definierte Ortsangabe für die Berechnung benutzt werden.
Hierzu ist eine 'latitude' und eine
'longitude' anzugeben und optional der
'horizon'.
Die Ortsangabe für eine Stadt auslesen 41.5, 'longitude' => 13.2446);
]]>
Da nun alle benötigten Daten angegeben werde können ist der nächste Schritt die
Erstellung eines Zend_Date Objekts mit dem Tag für welchen
Sonnenauf- oder -untergang berechnet werden sollen. Für die Berechnung stehen 3
Funktionen bereit. Die Berechnung des Sonnenaufganges ist mit
'getSunset()', des Sonnenuntergangs mit
'getSunrise()' und alle möglichen Informationen welche die
Sonne betreffen mit 'getSunInfo()' möglich. Nach der
Berechnung wird das Zend_Date Objekt mit der berechneten Zeit
zurückgegeben.
Berechnung von SonneninformationengetSunset($city);
print $sunset->get(Zend_Date::ISO_8601);
// Alle Sonneninformationen berechnen
$info = $date->getSunInfo($city);
foreach ($info as $sun) {
print "\n" . $sun->get(Zend_Date::ISO_8601);
}
]]>Zeitzonen
Zeitzonen sind genauso wichtig wie die Datumsangaben selbst. Es gibt einige Zeitzonen
abhängig davon wo auf der Welt der Benutzer lebt. Deshalb bedeutet das Arbeiten mit
Daten auch immer das eine gültige Zeitzone gesetzt ist. Das klingt eventuell
kompliziert, ist aber viel einfacher als erwartet. Wie schon im ersten Kapitel von
Zend_Date erwähnt muß immer eine Standardzeitzone ersetzt werden.
Entweder durch php.ini oder durch Definition in der Bootstrap
Datei.
Ein Zend_Date Objekt speichert natürlich die aktuelle Zeitzone.
Selbst wenn die Zeitzone nach der Erstellung des Objektes geändert wird, merkt sich das
Objekt die originale Zeitzone und arbeitet mit Ihr. Es ist also nicht notwendig die
Zeitzone im Code mithilfe von PHP Funktionen zu ändern.
Zend_Date hat zwei eingebaute Funktionen die es ermöglichen damit
zu Arbeiten.
getTimezone() gibt die aktuell gesetzte Zeitzone des
Zend_Date Objektes zurück. Man sollte in Erinnerung behalten das
Zend_Date nicht mit den PHP Internas gekoppelt
ist. Deshalb ist die zurückgegebene Zeitzone nicht die des PHP
Skripts sondern jene des Objektes. setTimezone($zone) ist die
zweite Funktion und ermöglicht es eine neue Zeitzone für
Zend_Date zu setzen. Eine angegebene Zeitzone wird immer geprüft.
Wenn diese nicht existiert wird eine Ausnahme geworfen. Zusätzlich kann die Zeitzone des
aktuellen Skripts oder des Systems für das Datumsobjekt gesetzt werden indem
setTimezone() ohne den Parameter zone aufgerufen wird. Das wird
auch automatisch gemacht wenn das Datumsobjekt erstellt wird.
Arbeiten mit ZeitzonengetIso();
// Welche Zeitzone ist gesetzt ?
print $date->getTimezone();
// Setzen einer anderen Zeitzone
$date->setTimezone('America/Chicago');
// Welche Zeitzone ist jetzt gesetzt ?
print $date->getTimezone();
// Ausgabe des geänderten Datumsobjektes
print $date->getIso();
]]>Zend_Date nimmt immer die aktuelle Zeitzone für das Erstellen
eines Objektes wie in den ersten Zeilen des Beispiels gezeigt. Das Ändern der Zeitzone
für ein erstelltes Objekt hat einen Effekt auf das Datum selbst. Daten sind immer
relativ zu einer Zeitzone. Das Ändern der Zeitzone für ein
Zend_Date Objekt ändert nicht die Zeit des
Zend_Date Objektes selbst. Man muß sich in Erinnerung halten das
Daten intern immer als Zeitpunkte und in der GMT gespeichert werden.
Eine Zeitzone bedeutet also wieviele Stunden subtrahiert oder addiert werden müssen um
die aktuelle globale Zeit für die eigene Zeitzone und Region er erhalten.
Das koppeln der Zeitzone innerhalb von Zend_Date hat einen
anderen positiven Nebeneffekt. Es ist möglich verschiedene Daten mit verschiedenen
Zeitzonen zu haben.
Mehrere ZeitzonengetIso();
// Das Datum bleibt unverändert selbst nach einer Änderung der Zeitzone
date_default_timezone_set('America/Chicago');
print $date->getIso();
$otherdate = clone $date;
$otherdate->setTimezone('Brazil/Acre');
// Ausgabe des Datumsobjektes
print $otherdate->getIso();
// Setzen der aktuellen Zeitzone des Systems für das Objekt
$lastdate = clone $date;
$lastdate->setTimezone();
// Ausgabe des Datumsobjektes
print $lastdate->getIso();
]]>