Programmer's Reference Guide
| Basis Methoden |
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.
Zend_Date Optionen
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: Selbst-definierte AUSGABE Formate welche PHP's date() Formatdefinition verwenden
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.
Wenn die aktuelle Zeitzone innerhalb der Instanz von
Zend_Date auf UTC oder GMT gestellt wird, wird die Option
'fix_dst' nicht verwendet weil diese zwei Zeitzonen nicht
mit DST arbeiten. Wenn die Zeitzone für diese Instanz wieder auf eine Zeitzone
gestellt wird die nicht UTC oder GMT ist, wird die vorher definierte 'fix_dst'
Option wieder für die Datumsberechnungen verwendet.
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.
Lokalisierung und Normalisierung von Daten mit Zend_Cache schneller machen
Man kann Zend_Date schneller machen indem ein Zend_Cache Adapter verwendet wird. Das verschnellert alle Methoden von Zend_Date wenn lokalisierte Daten verwendet werden. Zum Beispiel werden alle Methoden welche Zend_Date::DATE und Zend_Date::TIME Konstanten akzeptieren hiervon profitieren. Um einen Zend_Cache Adapter für Zend_Date zu setzen muß nur Zend_Date::setOptions(array('cache' => $adapter)); aufgerufen werden.
Syncronisierte Zeiten mit Zend_TimeSync erhalten
Normalerweise unterscheiden sich die Uhren von Servern und Computern voneinander. Zend_Date ist dazu fähig solche Probleme mit Hilfe von Zend_TimeSync zu handhaben. Mit Zend_Date::setOptions(array('timesync' => $timeserver)); kann ein Zeitserver gesetzt werden welcher den Unterschied zwischen dem eigenen aktuellen Zeitpunkt und dem wirklichen aktuellen Zeitpunkt für alle Instanzen von Zend_Date setzt. Die Verwendung dieser Option ändern nicht den Zeitpunkt von bestehenden Instanzen. Am besten ist es also dies innerhalb der Bootstrap Datei zu setzen.
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: 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 #1 Benutzerdefinierte Eingabeformate für Daten
$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"
// Stikte Interpretation des angegebenen Formats
$date3 = new Zend_Date('Feb 31, 2007', 'MM.dd.yyyy');
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.
Seit Zend Framework 1.7.0 unterstützt Zend_Date auch die Verwendung eines Anwendungsweiten Gebietsschemas. Man kann ganz einfach eine Zend_Locale Instanz in der Registry setzen wie anbei gezeigt. Mit dieser Schreibweise kann man das manuelle Setzen eines Gebietsschemas für jede Instanz vergessen wenn man das selbe Gebietsschema mehrere Male verwenden will.
// In der Bootstrap Datei
$locale = new Zend_Locale('de_AT');
Zend_Registry::set('Zend_Locale', $locale);
// Irgendwo in der eigenen Anwendung
$date = new Zend_Date('31.Feb.2007');
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 #2 Arbeiten an Teilen von Daten
$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
Liste der 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
|
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.
| 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 |
Vergleichen von Daten
Die folgenden Basisoperationen haben keine vergleichbaren vereinfachten Methoden für Datumsabschnitt wie beschrieben unter Zend_Date API Übersicht.
| 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) Diese Methode prüft ob ein angegebenes Datum ein echtes Datum ist, und gibt true zurück wenn alle Prüfungen in Ordnung waren. Sie arbeitet wie PHP's checkdate() Funktion, kann aber auch lokalisierte Monatsnamen prüfen sowie Daten die den Bereich von checkdate() übersteigen |
Daten und Teile von Daten erhalten
Verschiedene Methoden unterstützen das erhalten von Werten die auf eine Zend_Date Instanz bezug nehmen.
| Methode | Erklärung |
|---|---|
| toString() |
toString($format = null, $locale = null)
Direkt aufzurufen oder über die magische Methode
|
| toArray() |
toArray() Gibt eine Array Representation des ausgewählten Datums anhand der Konventionen des Gebietsschemas zurück. Das zurückgegebene Array ist identisch zu PHP's » getdate() Funktion und beinhaltet:
|
| 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
|
Arbeiten mit Sekundenbruchteilen
Viele Methoden unterstützen es, Werte relativ zu einer Zend_Date Instanz zu erhalten.
| Methode | Erklärung |
|---|---|
|
getFractionalPrecision() |
Gibt die Genauigkeit des Sekundenbruchteils zurück |
|
setFractionalPrecision() |
Setzt die Genauigkeit des Sekundenbruchteils |
Sonnenaufgang / Sonnenuntergang
Drei Methoden geben Zugriff auf geographisch lokalisierte Informationen über die Sonne was die Zeit für Sonnenaufgang und Sonnenuntergang beinhaltet.
| 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 |
| Basis Methoden |
