8.4. Zend_Date API Übersicht

Obwohl die API von Zend_Date simpel und eindeutig ist, ist dessen Design flexibel und mächtig durch die Vielzahl an Möglcihkeiten von Operationen und Operanden.

8.4.1. Zend_Date Optionen

8.4.1.1. Auswahl der Art des Datumsformats

Viele Methoden benutzen Zeichenketten für Datumsformate so ähnlich wie PHP's date(). Wenn man mit den Zeichen von PHP's Datumsformaten mehr Erfahrung hat als mit den ISO Zeichen für Formate dann kann man Zend_Date::setOptions(array('format_type' => 'php')) benutzen. Danach können PHP's Zeichen für Datumsformate für alle Funktionen verwendet werden die einen $format Parameter akzeptieren. Durch Benutzen von Zend_Date::setOptions(array('format_type' => 'iso')) kann man wieder auf den Standardmodus zurückwechseln der nur ISO Zeichen für Datumsformate unterstützt. Für eine Liste von unterstützten Zeichen Codes kann hier nachgelesen werden: Abschnitt 8.5.4, „Selbst-definierte AUSGABE Formate welche PHP's date() Formatdefinition verwenden“

8.4.1.2. Sommer-/Winterzeit und Datumsberechnungen

Wenn Daten manipuliert werden überschrieten Sie manchmal die Sommer-/Winterzeit Grenze was normalerweise dazu führt das das Datum eine Stunde verliert oder hinzubekommt. Wenn zum Beispiel ein Monat zu einem Datum vor einer Sommer-/Winterzeitänderung hinzugefügt wird und das Ergebnismonat nach dieser Änderung liegt, sieht es so aus als ob das Datum eine Stunde verliert oder hinzubekommt durch den Wert des geänderten Datums. Für Grenzstunden, wie Mitternacht für den ersten oder letzten Tag eines Monats, führt das Hinzufügen von genügend Monaten, wenn die Sommer-/Winterzeitgrenze überschritten wird, dazu das das Datum eine Stunde verliert und damit zum letzten Tag des Vormonats wird durch das Erscheinungsbild des "eins fehlt" Fehlers. Um diese Situationen zu vermeiden, kann die Sommer-/Winterzeit durch Verwendung der fix_dst Option ignoriert werden. Wenn eine Sommer-/Winterzeitgrenze überschritten wird, wird ja normalerweise eine Stunde hinzugefügt oder entfernt abhändig vom Datum. Zum Beispiel führt eine Datumsberechnung einer Frühlingsgrenze z ueinem Datum welche einen Tag weniger hat als erwartet, wenn die Zeit des Originaldatums 00:00:00 war. Da Zend_Date auf Zeitpunkten basiert und nicht auf Kalenderdaten mit Zeitkomponenten, verliert der Zeitpunkt eine Stunde was zu einem Datum führt das einen Kalendertag weniger hat als erwartet. Um solche Problem zu verhindern kann die Option fix_dst verwendet werden, welche standardmäßig wahr ist. Das führt dazu das die Sommer-/Winterzeit keinen Einfluß mehr bei Datumsberechnungen zeigt (addMOnth(), subMonth()). Zend_Date::setOptions(array('fix_dst' => false)) kann benutzt werden um Hinzufügen oder Entfernen der Sommer-/Winterzeitanpassung zu gestatten wenn Datumsberechnungen durchgeführt werden.

8.4.1.3. Monatsberechnungen

Wenn Monate von einem existierenden Datum hinzugefügt oder entfernt werden, kann der Ergebniswert des Monatstages unerwartet sein, wenn das Originaldatum auf einen Tag gefallen ist der Nahe am Ende des Monats ist. Wenn zum Beispiel ein Monat zum 31sten Jänner hinzugefügt wird, werden Personen welche mit SQL vertraut sind den 28sten Februar als Ergebnis erwarten. Auf der anderen Seite werden Personen welche mit Excel und OpenOffice vertraut sind werden den 3tten März als Ergebnis erwarten. Das Problem besteht nur wen das Ergebnismonat den Tag der im Originaldatum gesetzt war, nicht hat. Für ZF Entwickler können das gewünschte Verhalten ausgewählen indem die Option extend_month genutzt wird um entweder das SQL Verhalten, wenn die Option wahr ist, oder das Tabellenverhalten, wenn die Option falsch ist, auszuwählen. Das Standardverhalten für extend_month ist falsch, um SQL kompatibles Verhalten zu erlauben. Zend_Date führt Monatsberechnungen standardmäßig in der Art durch das Daten auf das Monatsende hin abgeschnitten werden (wenn notwendig), ohne das in den nächsten Monat umgebrochen wird wenn das Originaldatum einen Monatstag bestimmt der die Anzahl der Tag des Ergebnismonats überschreitet. Zend_Date::setOptions(array('extend_month' => true)); kann benutzt werden um Monatsberechnungen wie in populären Tabellenkalkulationen durchzuführen.

8.4.2. Arbeiten mit Datumswerten

Sobald die Eingabe durch die Erstellung eines Zend_Date Objektes normalisiert wurde, hat es eine zugeordnete Zeitzone aber eine Interne Darstellung durch Verwendung von UNIX Zeitpunkten. Damit ein Datum in einer lokalisierten Art und Weise durchsucht werden kann, muß zuerst eine Zeitzone bekannt sein. Die Standardzeitzone ist immer GMT/UTC. Um die Zeitzone des Objektes zu inspizieren kann getTimeZone()) verwendet werden. Um die Zeitzone des Objektes zu wechseln kann setTimeZone()) verwendet werden. Alle Änderungen des Objektes sind immer relativ zu seiner Zeitzone zu sehen.

Aufpassen das nicht Teile von Datumsobjekten die unterschiedliche Zeitzonen haben, gemischt oder verglichen werden, da dies Grundsätzlich unerwartete Resultate zeigen kann da die Manipulationen nur dem Zeitpunkt zugeordnet werden. Das Arbeiten an Zend_Date Objekten die unterschiedliche Zeitzonen haben funktioniert grundsätzlich abgesehen davon wie vorher erwähnt, da Daten bei der Instantiierung von Zend_Date zu UNIX Zeitpunkten normalisiert werden.

Die meisten Methoden erwarten eine Konstante für die Auswahl des gewünschten Teils $part des Datums, wie z.B. Zend_Date::HOUR. Diese Konstanten sind für alle unten angeführten Funktionen gültig. Eine Liste aller vorhandenen Konstanten wird hier beschrieben: Abschnitt 8.5.2, „Liste aller Konstanten“. Wenn $part nicht spezifiziert wird, wird Zend_Date::TIMESTAMP angenommen. Alternativ kann ein benutzerdefiniertes Format für $part verwendet werden, mit Hilfe der gleichen Mechanismen und Formatdefinitionen wie bei Zend_Locale_Format::getDate() . Wenn ein Datumsobjekt erstellt wird durch Verwendung eines offensichtlich falschen Datums (z.B. die Nummer des Monats größer als 12), wird Zend_Date eine Ausnahme werfen, solange kein spezielles Datumsformat ausgewählt wurde, und z.B. $part entweder null oder Zend_Date::DATES (ein "fehlertolerantes" Format).

Beispiel 8.8. Benutzerdefinierte Eingabeformate für Daten

<?php
$date1 = new Zend_Date('Feb 31, 2007', null, 'en_US');
echo $date1, "\n"; // Ausgabe "Mar 3, 2007 12:00:00 AM"

$date2 = new Zend_Date('Feb 31, 2007', Zend_Date::DATES, 'en_US');
echo $date2, "\n"; // Ausgabe "Mar 3, 2007 12:00:00 AM"

$date3 = new Zend_Date('Feb 31, 2007', 'MM.dd.YYYY'); // Stikte Interpretation des angegebenen Formats
echo $date3, "\n"; // Ausgabe "Mar 3, 2007 12:00:00 AM"
?>

Wenn der optionale $locale Parameter angegeben wurde, dann verdeutlicht $locale den $date Operand durch Ersetzen der Monatsnamen und Wochentagsnamen für die $date Zeichenkette, und auch Datumszeichenketten können analysiert werden durch die Vorschriften dieses Gebietsschemas (siehe Zend_Locale_Format::getDate()). Die automatische Normalisierung von lokalisierten $date Angaben einer Zeichenkette werden nur dann durchgeführt wenn eine der Zend_Date::DATE* oder Zend_Date::TIME* Konstanten verwendet wird. Das Gebietsschema identifiziert die Sprache welche verwendet werden soll um Monatsnamen und Wochentagsnamen zu analysieren wenn $date eine Zeichenkette ist die ein Datum enthält. Wenn der Eingabeparameter $date nicht angegeben wurde, dann definiert der $locale Parameter das Gebietsschema für lokalisierte Ausgaben (z.B. das Datumsformat für eine Ausgabe als Zeichenkette). Anzumerken ist auch das der $date Parameter stattdessen ein Typname sein kann (z.B. $hour für addHour()), und das verhindert auch nicht das ein Zend_Date Objekt als Argument für diesen Parameter angegeben werden kann. Wenn keine $locale angegeben wurde, wird das Gebietsschema des aktuellen Objektes genommen um $date zu interpretieren oder das lokalisierte Format für die Ausgabe auszuwählen.

8.4.3. Grundsätzliche Zend_Date Operationen für die meisten Teile von Daten

Die Methoden add(), sub(), compare(), get(), und set() arbeiten generell mit Daten. In Jedem Fall wird die Operation auf dem Datum durchgeführt das in den Objektinstanz vorhanden ist. Der $date Operand wird für alle dieser Methoden benötigt, ausser für get() und kann eine Zend_Date Objektinstanz, eine nummerische Zeichenkette oder ein Integer sein. Diese Methoden nehmen an das $date ein Zeitpunkt ist, wenn es kein Objekt ist. Trotzdem kontrolliert der $part Operand an welchem logischen Teil der zwei Daten gearbeitet werden soll, was Arbeiten an Teilen von Daten des Objekts erlaubt, wie Jahr oder Minute selbst wenn $date eine lange Form einer Datumszeichenkette enthält wie "Dezember 31, 2007 23:59:59". Das Ergebnis der Operation ändert das Datum im Objekt ausser bei compare() und get().

Beispiel 8.9. Arbeiten an Teilen von Daten

<?php
require_once 'Zend/Date.php';

$date = new Zend_Date(); // $date's Zeitpunkt === time()

// Ändert $date durch addieren von 12 Stunden
$date->add('12', Zend_Date::HOUR);
print $date;
?>

Übliche Methoden existieren für jede Kombination von Basisarbeiten und viele normale Datumsabschnitte wie in der Tabelle anbei gezeigt. Diese üblichen Methoden erlauben uns faulen Programmierern zu vermeiden das die Konstanten für Datumsabschnitte ausgeschrieben werden müssen. Normalerweise sind wir benannt durch Kombination eines Prefixes (Name der Basisoperation) und einem Suffix (Art des Datumsabschnittes), wie addYear(). In der Liste die anbei steht, existieren alle Kombinationen von "Datumsabschnitten" und "Basisoperationen". Zum Beispiel die Operation "add" existiert für jeden dieser Datumsabschnitte wie addDay(), addYear() und viele mehr.

Diese üblichen Methoden haben die selbe gleichartige Funktionalität wie die Methoden für die Basisoperationen, aber Sie erwarten Zeichenkette und Integer $date Operanden welche nur die Werte enthalten welche durch den Typ definiert sind der durch den Suffix der Methode definiert wurde. Deshalb identifizieren diese Methoden (z.B. "Year" oder "Minute") die Einheit des $date Operanden wenn $date eine Zeichenkette oder ein Integer ist

8.4.3.1. Liste der Datumsabschnitte

Tabelle 8.1. Datumsabschnitte

Datumsabschnitt Erklärung
Zeitpunkt UNIX Zeitpunkt, ausgedrückt in Sekunden die vergangen sind seit dem 1. Jänner, 1970 00:00:00 GMT/UTC.
Jahr Gregorianisches Kalenderjahr (z.B. 2006)
Monat Gregorianisches Kalendermonat (1-12, Lokalisierte Namen werden unterstützt)
24 Stunden Uhr Stunde des Tages (0-23) bezeichnet die vergangenen Stunden seit dem Beginn des Tages
Minute Minuten der Stunde (0-59) bezeichnet die vergangenen Minuten seit dem Beginn der Stunde
Sekunde Sekunde der Minute (0-59) bezeichnet die vergangenen Sekunden seit dem Beginn der Minute
Millisekunde Millisekunden bezeichnen Tausendstel einer Sekunde (0-999). Zend_Date unterstützt zwei zusätzliche Methoden für das Arbeiten mit Zeiteinheiten die kleiner als Sekunden sind. Normalerweise verwenden Zend_Date Instanzen eine Genauigkeit welche der von Millisekunden entspricht wie man durch getFractionalPrecision() sehen kann. Um die Genauigkeit zu Ändern kann setFractionalPrecision($precision) verwendet werden. Trotzdem ist die Genauigkeit praktisch auf Millisekunden begrezt da Zend_Date microtime() dafür benutzt.
Tag Zend_Date::DAY_SHORT wird von $date extrahiert wenn der $date Operand eine Zend_Date Instanz oder eine nummerische Zeichenkette ist. Sonst wird versucht den Tag laut den dokumentierten Konventionen für diese Konstanten zu extrahieren: Zend_Date::WEEKDAY_NARROW , Zend_Date::WEEKDAY_NAME, Zend_Date::WEEKDAY_SHORT , Zend_Date::WEEKDAY (Gregorianischer Kalender angenommen)
Woche Zend_Date::WEEK wird von $date extrahiert wenn der $date Operand eine Instanz von Zend_Date oder eine nummerische Zeichenkette ist. Sonst wird eine Ausnahme geworfen. (Gregorianischer Kalender angenommen)
Datum Zend_Date::DAY_MEDIUM wird aus $date extrahiert wenn der $date Operand eine Instanz von Zend_Date ist. Sonst wird versucht das Datum in ein Zend_Date::DATE_MEDIUM formatiertes Datum zu normalisieren. Das Format von Zend_Date::DATE_MEDIUM hängt vom Gebietsschema des Objektes ab.
Wochentage Wochentage werden nummerisch dargestellt von 0 (für Sonntag) bis 6 (für Samstag). Zend_Date::WEEKDAY_DIGIT wird aus $date extrahiert wenn der $date Operand eine Instanz von Zend_Date oder eine numerische Zeichenkette ist. Sonst wird versucht den Tag laut den dokumentierten Konventionen für diese Konstanten zu extrahieren: Zend_Date::WEEKDAY_NARROW, Zend_Date::WEEKDAY_NAME, Zend_Date::WEEKDAY_SHORT, Zend_Date::WEEKDAY (Gregorianischer Kalender angenommen)
Tag des Jahres In Zend_Date wird der Tag des Jahres als Anzahl der Kalendertage dargestellt die seit dem Start des Jahres vergangen sind (0-365). Wie bei den anderen oben dargestellten Einheiten werden Bruchteile auf die nächste ganze Nummer abgerundet. (Gregorianischer Kalender angenommen)
Arpa Arpa Daten (bzw RFC 822 formatierte Daten) werden unterstützt. Die Ausgabe verwendet entweder "GMT" oder "Laut Gebietsschema unterschiedliche Stunden + Minuten" Format (siehe Sektion 5 von RFC 822). Vor PHP 5.2.2, zeigte die Verwendung der DATE_RFC822 Konstante mit PHP date Funktionen hier und da fehlerhafte Ergebnisse. Die Ergebnisse von Zend_Date sind korrekt. Beispiel: Mon, 31 Dec 06 23:59:59 GMT
Iso Für die Ausgabe werden nur vollständige ISO 8601 Daten unterstützt. Beispiel: 2009-02-14T00:31:30+01:00

8.4.3.2. Liste der Datums-Operationen

Die unten angeführten Basisoperationen können statt den bequemlichen Operationen für spezielle Datumsabschnitte verwendet werden. Die entsprechenden Konstanten werden für den $part Parameter verwendet.

Tabelle 8.2. Basis Operationen

Basis Operationen Erklärung
get()

get($part = null, $locale = null)

get($part) kann benutzt werden um einen Datumsabschnitt $part dieses Datumsobjektes welcher in ein Gebietsschema lokalisiert oder als formatierte Zeichenkette oder Integer gewünscht ist zurück zu bekommen. Durch Verwendung der BCMath Erweiterung können nummerische Zeichenkettten statt Integer für große Werte zurückgegeben werden. NOTE: Anders als get() geben die anderen get*() bequemlichen Methoden nur Instanzen von Zend_Date zurück welche nur das Datum oder die Zeit repräsentieren das ausgewählt oder berechnet wurde.

set()

set($date, $part = null, $locale = null)

Setzt den Abschnitt $part des aktuellen Objektes übereinstimmend mit dem Wert der für diesen Abschnitt in der Eingabe $date und im Gebietsschema $locale gefunden wurde.

add()

add($date, $part = null, $locale = null)

Addiert den Abschnitt $part von $date welcher im Gebietsschema $locale geschrieben ist zum Datum des aktuellen Objektes.

sub()

sub($date, $part = null, $locale = null)

Subtrahiert den Abschnitt $part von $date welcher im Gebietsschema $locale geschrieben ist vom Datum des aktuellen Objektes.

copyPart()

copyPart($part, $locale = null)

Gibt ein geklontes Objekt zurück, wobei nur der gewünschte Abschnitt $part des Datumsobjektes kopiert wird, wobei im Klon das Gebietsschema von $locale gesetzt wird (wenn angegeben).

compare()

compare($date, $part = null, $locale = null)

Vergleicht den Abschnitt $part des Datums $date mit dem Zeitpunkt des Objektes. Gibt 0 zurück wenn sie gleich sind, 1 wenn wenn der Abschnitt dieses Objektes früher war als der Abschnitt von $date und andernfalls -1.

8.4.4. Vergleichen von Daten

Die folgenden Basisoperationen haben keine vergleichbaren vereinfachten Methoden für Datumsabschnitt wie beschrieben unter Abschnitt 8.4, „Zend_Date API Übersicht“.

Tabelle 8.3. Methoden zum Vergleichen von Daten

Methoden Beschreibung
equals()

equals($date, $part = null, $locale = null)

Gibt true zurück wenn der Abschnitt $part von $date der das Gebietsschema $locale hat, der gleiche ist wie der Abschnitt $part vom Datum des Objektes, andernfalls false

isEarlier()

isEarlier($date, $part = null, $locale = null)

Gibt true zurück wenn der Abschnitt $part vom Datum des Objektes früher ist als der Abschnitt $part von $date der das Gebietsschema $locale hat

isLater()

isLater($date, $part = null, $locale = null)

Gibt true zurück wenn der Abschnitt $part vom Datum des Objektes später ist als der Abschnitt $part von $date der das Gebietsschema $locale hat

isToday()

isToday()

Testet ob Jahr, Monat und Tag des heutigen Datums mit dem Datumswert des Objektes übereinstimmen, wenn die Zeitzone des Objektes verwendet wird.

isTomorrow()

isTomorrow()

Testet ob Jahr, Monat und Tag des morgigen Datums mit dem Datumswert des Objektes übereinstimmen, wenn die Zeitzone des Objektes verwendet wird.

isYesterday()

isYesterday()

Testet ob Jahr, Monat und Tag des gestrigen Datums mit dem Datumswert des Objektes übereinstimmen, wenn die Zeitzone des Objektes verwendet wird.

isLeapYear()

isLeapYear()

isLeapYear() kann benutzt werden ob zu prüfen ob das aktuelle Objekt ein Schaltjahr ist. Sonst kann Zend_Date::checkLeapYear($year) benutzt werden um das Jahr $year zu prüfen, welches eine Zeichenkette, ein Integer oder eine Instanz von Zend_Date sein kann. Ist das Jahr ein Schaltjahr ?

isDate()

isDate($date, $format = null, $locale = null)

This method checks if a given date is a real date and returns true if all checks are ok. It works like php's checkdate() function but can also check for localized month names and for dates extending the range of checkdate() false

8.4.5. Getting Dates and Date Parts

Several methods support retrieving values related to a Zend_Date instance.

Tabelle 8.4. Date Output Methods

Method Explanation
toString()

toString($format = null, $locale = null)

Direkt aufzurufen oder über die magische Methode __toString(). Die toString() Methode formatiert automatisch den Wert des Datumsobjektes anhand der Konventionen des Gebietsschemas des Objektes, oder einem optional definierten Gebietsschema $locale. Für eine Liste von unterstützten Formatcodes kann hier nachgeschaut werden: Abschnitt 8.5.3, „Selbst-Definierte AUSGABE Formate mit ISO“.

toValue()

toValue($part = null)

Gibt eine Integer Repräsentation des ausgewählten Datumsabschnittes $part zurück anhand der Konventionen des Gebietsschemas des Objektes. Gibt false zurück wenn der Abschnitt $part ein nicht numerischer Wert ist, wie Zend_Date::MONTH_NAME_SHORT. NOTIZ: Diese Methode ruft get() auf und castet das Ergebnis einen PHP Integer Wert, welcher unerwartete Ergebnisse liefern wird, wenn get() eine numerische Zeichenkette zurückgibt die eine Zahl enthält welche zu groß für einen PHP Integer Wert auf Ihrem System ist. Stattdessen sollte get() benutzt werden.

get()

get($part = null, $locale = null)

Diese Methode gibt den Abschnitt $part vom Datum des Objektes, welches mit dem Gebietsschema $locale lokalisiert wurde, als formatierten String oder Integer zurück. Für weitere Informationen hier weiterlesen: Abschnitt 8.4.3.2, „Liste der Datums-Operationen“.

now()

now($locale = null)

Diese bequemliche Funktion ist identisch mit new Zend_Date(). Sie gibt das aktuelle Datum als Zend_Date Objekt zurück, welches das Gebietsschema $locale hat.

8.4.6. Arbeiten mit Sekundenbruchteilen

Viele Methoden unterstützen es, Werte relativ zu einer Zend_Date Instanz zu erhalten.

Tabelle 8.5. Methoden zur Datumsausgabe

Methode Erklärung

getFractionalPrecision()

Gibt die Genauigkeit des Sekundenbruchteils zurück

setFractionalPrecision()

Setzt die Genauigkeit des Sekundenbruchteils

8.4.7. Sonnenaufgang / Sonnenuntergang

Drei Methoden geben Zugriff auf geographisch lokalisierte Informationen über die Sonne was die Zeit für Sonnenaufgang und Sonnenuntergang beinhaltet.

Tabelle 8.6. Gewöhliche Methoden

Methode Erklärung

getSunrise($location)

Gibt die Zeit des Sonnenaufgangs dieses Datums zurück

getSunset($location)

Gibt die Zeit des Sonnenuntergangs dieses Datums zurück

getSunInfo($location)

Gibt ein Array mit den Sonnendaten des Datums zurück