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.
    
            Die meisten Daten werden normalerweise als Zeichenketten übergeben. Aber das Problem mit Zeichenketten
            is 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' falsch zurück, weil sie weiß
            das dieses Datum unmöglich ist.
        
Beispiel 8.12. Prüfen von Daten
<?php
require_once 'Zend/Date.php';
// Prüfen des Datums
$date = '01.03.2000';
if (Zend_Date::isDate($date)) {
    print "Zeichenkette $date ist ein Datum";
} else {
    print "Zeichenkette $date ist KEIN Datum";
}
// Prüfen eines lokalisierten Datums
$date = '01 February 2000';
if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) {
    print "Zeichenkette $date ist ein Datum";
} else {
    print "Zeichenkette $date ist KEIN Datum";
}
// Prüfen eines unmöglichen Datums
$date = '30 February 2000';
if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) {
    print "Zeichenkette $date ist ein Datum";
} else {
    print "Zeichenkette $date ist KEIN Datum";
}
?>
            Zend_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.
        
Beispiel 8.13. Alle verfügbaren Städte ausgeben
<?php require_once 'Zend/Date/Cities.php'; // Ausgabe der kompletten Liste aller verfügbaren Städte print_r (Zend_Date_Cities::getCityList()); ?>
            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.
        
Tabelle 8.18. Arten von unterstützten Horizonten für Sonnenauf- und -untergang
| Horizont | Beschreibung | Verwendung | 
|---|---|---|
| effective | Standard Horizont | Nimmt an das die Welt ein Ball ist. Dieser Horizont wird immer benutzt wenn keiner definiert wurde. | 
| civil | Üblicher Horizont | Oft in den üblichen Medien wie Fernsehen und Radio benutzt. | 
| nautic | Nautischer Horizont | Oft in der Navigation zu See benutzt. | 
| astronomic | Astronomischer Horizont | Oft 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'.
        
Beispiel 8.14. Die Ortsangabe für eine Stadt auslesen
<?php
require_once 'Zend/Date/Cities.php';
// Die Ortsangabe für eine bestimmte Stadt auslesen
// Benutzt den effektiven Horizont da kein Horizont angegeben wurde
print_r (Zend_Date_Cities::City('Vienna'));
// Benutzt den nautischen Horizont
print_r (Zend_Date_Cities::City('Vienna', 'nautic'));
// Selbstdefinition einer Ortsangabe
$mylocation = array('latitude' => 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.
        
Beispiel 8.15. Berechnung von Sonneninformationen
<?php
require_once 'Zend/Date.php';
require_once 'Zend/Date/Cities.php';
// Die Ortsangabe einer bestimmten Stadt auslesen
$city = Zend_Date_Cities::City('Vienna');
// Ein Datumsobjekt erstellen für den Tag für den die Sonne berechnet werden soll
$date = new Zend_Date('10.03.2007', Zend_Date::ISO_8601, 'de');
// Sonnenuntergang berechnen
$sunset = $date->getSunset($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 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.
        
Beispiel 8.16. Arbeiten mit Zeitzonen
<?php
require_once 'Zend/Date.php';
// Setzen einer Standardzeitzone... das muß in der Bootstrap Datei oder php.ini gemacht werden
// Wir setzen Sie hier nur der Vollständigkeit halber um ein komplettes Beispiel zu erhalten
date_defaut_timezone_set('Europe/Vienna');
// Erstellen des Datumsobjektes
$date = new Zend_Date('10.03.2007', Zend_Date::ISO_8601, 'de');
// Ausgabe des Datumsobjektes
print $date->getIso();
// 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 Zend_Date 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.
        
Beispiel 8.17. Mehrere Zeitzonen
<?php
require_once 'Zend/Date.php';
// Setzen einer Standardzeitzone... das muß in der Bootstrap Datei oder php.ini gemacht werden
// Wir setzen Sie hier nur der Vollständigkeit halber um ein komplettes Beispiel zu erhalten
date_defaut_timezone_set('Europe/Vienna');
// Erstellen des Datumsobjektes
$date = new Zend_Date('10.03.2007 00:00:00', Zend_Date::ISO_8601, 'de');
// Ausgabe des Datumsobjektes
print $date->getIso();
// 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();
?>