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.
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“
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.
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.
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.
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
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
|
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)
|
set() |
set($date, $part = null, $locale = null)
Setzt den Abschnitt |
add() |
add($date, $part = null, $locale = null)
Addiert den Abschnitt |
sub() |
sub($date, $part = null, $locale = null)
Subtrahiert den Abschnitt |
copyPart() |
copyPart($part, $locale = null)
Gibt ein geklontes Objekt zurück, wobei nur der gewünschte Abschnitt
|
compare() |
compare($date, $part = null, $locale = null)
Vergleicht den Abschnitt |
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 |
isEarlier() |
isEarlier($date, $part = null, $locale = null)
Gibt true zurück wenn der Abschnitt |
isLater() |
isLater($date, $part = null, $locale = null)
Gibt true zurück wenn der Abschnitt |
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()
|
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 |
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 |
toValue() |
toValue($part = null)
Gibt eine Integer Repräsentation des ausgewählten Datumsabschnittes |
get() |
get($part = null, $locale = null)
Diese Methode gibt den Abschnitt |
now() |
now($locale = null)
Diese bequemliche Funktion ist identisch mit |
Viele Methoden unterstützen es, Werte relativ zu einer Zend_Date
Instanz zu erhalten.
Drei Methoden geben Zugriff auf geographisch lokalisierte Informationen über die Sonne was die Zeit für Sonnenaufgang und Sonnenuntergang beinhaltet.