Programmer's Reference Guide
| Normalisierung und Lokalisierung |
Arbeiten mit Daten und Zeiten
Zend_Locale_Format bietet verschiedene Methoden für das Arbeiten mit Daten und Zeiten und hilft bei der Konvertierung und Normalisierung zwischen verschiedenen Formaten und verschiedenen Gebietsschemata. Für die Manipulation von Datumszeichenketten die bereits übereinstimmen mit einem der vielen international erkannten Standardformate, oder einem der lokalisierten Datumsformat welche von Zend_Date verwendet werden. Die Verwendung von vordefinierten Formate bietet Vorteile, wie die Benutzung von gut getestetem Code, und die Sicherheit von Beweglichkeit und Interoperabilität (abhängig vom benutzten Standard). Das unten angeführte Beispiel folgt nicht dieser Empfehlung, da die Benutzung von nicht standardmäßigen Datumsformaten die Verständlichkeit der Beispiele unnötig erhöhen wurde.
Daten und Zeiten normalisieren
Die Methode getDate() analysiert Zeichenketten welche Daten in einem
lokalisierten Format enthalten. Das Ergebnis wird als strukturiertes Array zurück
gegeben, mit gut definierten Schlüsseln für jeden Teil des Datums. Zusätzlich enthält
das Array den Schlüssel 'date_format' der den Format String zeigt der benutzt wurde um
die Zeichenkette mit dem Eingabedatum zu analysieren. Da ein lokalisiertes Datum nicht
alle Teile eines Datums oder einer Zeit enthalten muß, sind alle Schüssel Paare des
Arrays optional. Wenn zum Beispiel nur Jahr, Monat und Tag gegeben sind, dann werden
alle Zeit Werte beim zurückgegebenen Array unterdrückt und umgekehrt wenn nur Stunde,
Minute und Sekunde als Eingabe angegeben werden. Wenn weder ein Datum noch eine Zeit in
der Eingabe gefunden werden, dann wird eine Ausnahme geworfen.
Wenn setOption(array('fix_date' => true)) gesetzt wird, enthält die Methode
getDate() einen Schlüssel 'fixed' der eine Zahl enthält welche anzeigt ob
die eingegebene Zeichenkette korrigiert wurde indem Tag, Monat oder Jahr getauscht
wurden um in das Format zu passen das angegeben wurde.
| Wert | Bedeutung |
|---|---|
| 0 | Nichts korrigiert |
| 1 | Falsches Monat wurde korrigiert |
| 2 | Tag und Jahr wurden getauscht |
| 3 | Monat und Jahr wurden getauscht |
| 4 | Monat und Tag wurden getauscht |
Für jene die ein spezielles Format für Datumseingaben definieren müssen, werden die nachfolgend angegebenen Format Zeichen unterstützt. Wenn ein ungültiges Format Zeichen verwendet wird, so wie PHP's 'i' Zeichen in einem ISO Format, dann wird ein Fehler von den Methoden, die benutzerdefinierte Formate in Zend_Locale_Format unterstützen, geworfen.
Die unten angegebenen Zeichen sind nur ein kleiner Teil des kompletten "ISO" Sets
welches von Zend_Date's toString() unterstützt
werden. Wenn PHP date() kompatible Format Zeichen benutzt werden müssen,
dann muß zuerst setOptions(array('format_type' => 'php')) aufgerufen
werden. Und wenn eine spezielle Format Zeichenkette vom PHP date()
kompatiblen Format in ein "ISO" Format konvertiert werden muß kann
convertPhpToIsoFormat() benutzt werden. Aktuell besteht die einzige
praktische Differenz darin dass das Zeichen für Minuten unterschiedlich ist ('m' wird im
ISO Format und 'i' im PHP date Format verwendet).
| getDate() Format Zeichen | Array Schlüssel | Rückgabewert | Minimum | Maximum |
|---|---|---|---|---|
| d | day | Integer | 1 | 31 |
| M | month | Integer | 1 | 12 |
| y | year | Integer | kein Limit | PHP's Maximum für Integer |
| h | hour | Integer | 0 | PHP's Maximum für Integer |
| m | minute | Integer | 0 | PHP's Maximum für Integer |
| s | second | Integer | 0 | PHP's Maximum für Integer |
Beispiel #1 Normalisieren von Daten
$dateString = Zend_Locale_Format::getDate('13.04.2006',
array('date_format' =>
'dd.MM.yyyy')
);
// Erstellt ein Zend_Date Objekt für dieses Datum
$dateObject = Zend_Date('13.04.2006',
array('date_format' => 'dd.MM.yyyy'));
print_r($dateString); // Ausgabe
Array
(
[format] => dd.MM.yyyy
[day] => 13
[month] => 4
[year] => 2006
)
// Alternativ können einige Arten von Problemen mit
// den Eingabedaten automatisch korrigiert werden
$date = Zend_Locale_Format::getDate('04.13.2006',
array('date_format' => 'dd.MM.yyyy',
'fix_date' => true)
);
print_r($date); // Ausgabe
Array
(
[format] => dd.MM.yyyy
[day] => 13
[month] => 4
[year] => 2006
[fixed] => 4
)
Da getDate() "lokalisierbar" ist, ist die Angabe von $locale
ausreichend um Datumseingaben einem Gebietsschema Format zuzuordnen. Die Option
'fix_date' verwendet einfache Tests um herauszufinden ob Tag oder Monat
ungültig sind, um dann eine Heuristik anzuwenden die versucht alle gefundenen Probleme
zu korrigieren. Anzumerken ist auch die Verwendung von
'Zend_Locale_Format::STANDARD' als Wert für
'date_format' bei der Funktion setOptions() um zu verhindern
das das klassenweit gesetzte standardmäßige Datumsformat verwendet wird. Das zwingt
getDate dazu das standardmäßige Datumsformat dieser $locale zu verwenden.
Beispiel #2 Normalisieren eines Datums durch ein Gebietsschema
$locale = new Zend_Locale('de_AT');
$date = Zend_Locale_Format::getDate('13.04.2006',
array('date_format' =>
Zend_Locale_Format::STANDARD,
'locale' => $locale)
);
print_r ($date);
Ein komplettes Datum mit Uhrzeit wird zurückgegeben, wenn die Eingabe beides, ein Datum und eine Uhrzeit, um erwarteten Format enthält.
Beispiel #3 Normalisieren eines Datums mit Uhrzeit
$locale = new Zend_Locale('de_AT');
$date = Zend_Locale_Format::getDate('13.04.2005 22:14:55',
array('date_format' =>
Zend_Locale_Format::STANDARD,
'locale' => $locale
);
print_r ($date);
Wenn ein spezielles Format gewünscht ist, muß das $format Argument
definiert werden, ohne der Angabe von $locale. Nur die einzelnen Zeichen
(H, m, s, y, M, d), und MMMM und EEEE werden bei $format unterstützt.
Beispiel #4 Normalisieren eines Benutzerdefinierten Datums
$date = Zend_Locale_Format::getDate('13200504T551422',
array('date_format' =>
'ddyyyyMM ssmmHH')
);
print_r ($date);
Ein Format kann die folgenden Zeichen enthalten:
| Format Buchstabe | Beschreibung |
|---|---|
| d oder dd | Tag mit 1 oder 2 Ziffern |
| M oder MM | Monat mit 1 oder 2 Ziffern |
| y oder yy | Jahr mit 1 or 2 Ziffern |
| yyyy | Jahr mit 4 Ziffern |
| h | Stunde mit 1 oder 2 Ziffern |
| m | Minute mit 1 oder 2 Ziffern |
| s | Sekunde mit 1 oder 2 Ziffern |
Beispiele für gültige Formate sind
| Formate | Eingabe | Ausgabe |
|---|---|---|
| dd.MM.yy | 1.4.6 | ['day'] => 1, ['month'] => 4, ['year'] => 6 |
| dd.MM.yy | 01.04.2006 | ['day'] => 1, ['month'] => 4, ['year'] => 2006 |
| yyyyMMdd | 1.4.6 | ['day'] => 6, ['month'] => 4, ['year'] => 1 |
Hinweis: Datumsformate für Datenbanken
Um einen Datumswert einer Datenbank zu analysieren (zum Beispiel MySql oder MsSql) sollte Zend_Date's ISO_8601 Format statt getDate() benutzt werden.
Die Option 'fix_date' benutzt einfache Tests um herauszufinden ob der Tag
oder das Monat ungültig sind, und wendet dann eine Heuristik an die versucht die
erkannten Probleme zu beheben. getDate() erkennt und behebt automatisch
einige Problem mit falschen Eingabe, wie zum Beispiel ein falsch plaziertes Jahr:
Beispiel #5 Automatische Korrektur von Datumsangaben
$date = Zend_Locale_Format::getDate('41.10.20',
array('date_format' => 'ddMMyy',
'fix_date' => true)
);
// Statt 41 für den Tag wird die 41 als Wert für das Jahr zurück gegeben
print_r ($date);
Testen von Daten
checkDateFormat($inputString, array('date_format' => $format, $locale))
kann benutzt werden um zu prüfen ob eine Zeichenkette alle erwarteten Datumsteile
enthält. Die Methode checkDateFormat() benutzt getDate() aber
ohne die Verwendung der Option 'fixdate' um zu verhindern das wahr zurück
gegeben wird wenn die Eingabe nicht dem Datumsformat entspricht. Wenn Fehler in der
Eingabe gefunden werden, wie zum Beispiel getauschte Werte für Monat oder Jahr, wendet
die Option 'fixdate' eine Heuristik an um das "richtige" Datum zu eruieren
bevor dieses auf Gültigkeit geprüft wird.
Beispiel #6 Testen von Daten
$locale = new Zend_Locale('de_AT');
// Standard Datumsformate für 'de_AT' benutzen... ist es ein gültiges Datum ?
if (Zend_Locale_Format::checkDateFormat('13.Apr.2006',
array('date_format' =>
Zend_Locale_Format::STANDARD,
$locale)
) {
print "Datum";
} else {
print "kein Datum";
}
Normalisieren von Zeiten
Normalerweise werden Zeiten zusammen mit einem Datum zurückgegeben, wenn die Eingabe
beide Werte enthält. Wenn das richtige Format nicht bekannt ist, aber das Gebietsschema
für die Eingabe des Benutzers bekannt ist, sollte getTime() verwendet
werden, weil es das standardmäßige Zeitformat für das ausgewählte Gebietsschema benutzt.
Beispiel #7 Normalisieren einer unbekannten Zeit
$locale = new Zend_Locale('de_AT');
if (Zend_Locale_Format::getTime('13:44:42',
array('date_format' =>
Zend_Locale_Format::STANDARD,
'locale' => $locale)
) {
print "Zeit";
} else {
print "keine Zeit";
}
Testen von Zeiten
checkDateFormat() kann verwendet werden um zu prüfen ob eine Zeichenkette
eine gültige Zeit enthält. Die Verwendung ist genau die gleiche wie beim Prüfen von
Daten und date_format sollte die Teile enthalten von denen erwartet wird
das man Sie erhält.
Beispiel #8 Testen einer Zeit
$locale = new Zend_Locale('de_AT');
if (Zend_Locale_Format::checkDateFormat('13:44:42',
array('date_format' => 'HH:mm:ss',
'locale' => $locale)) {
print "Zeit";
} else {
print "keine Zeit";
}
| Normalisierung und Lokalisierung |
