Zend_Locale-DatesTimes.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15156 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.locale.date.datesandtimes">
  5. <title>Arbeiten mit Daten und Zeiten</title>
  6. <para>
  7. <classname>Zend_Locale_Format</classname> bietet verschiedene Methoden für das Arbeiten mit Daten und Zeiten und hilft
  8. bei der Konvertierung und Normalisierung zwischen verschiedenen Formaten und verschiedenen Gebietsschemata.
  9. Für die Manipulation von Datumszeichenketten die bereits übereinstimmen mit
  10. <link linkend="zend.date.constants">einem der vielen international erkannten Standardformate, oder einem der
  11. lokalisierten Datumsformat welche von <classname>Zend_Date</classname> verwendet werden</link>.
  12. Die Verwendung von vordefinierten Formate bietet Vorteile, wie die Benutzung von gut getestetem Code, und
  13. die Sicherheit von Beweglichkeit und Interoperabilität (abhängig vom benutzten Standard). Das unten angeführte
  14. Beispiel folgt nicht dieser Empfehlung, da die Benutzung von nicht standardmäßigen Datumsformaten die
  15. Verständlichkeit der Beispiele unnötig erhöhen wurde.
  16. </para>
  17. <sect2 id="zend.locale.date.normalize">
  18. <title>Daten und Zeiten normalisieren</title>
  19. <para>
  20. Die Methode <code>getDate()</code> analysiert Zeichenketten welche Daten in einem lokalisierten Format
  21. enthalten. Das Ergebnis wird als strukturiertes Array zurück gegeben, mit gut definierten Schlüsseln
  22. für jeden Teil des Datums. Zusätzlich enthält das Array den Schlüssel 'date_format' der den Format
  23. String zeigt der benutzt wurde um die Zeichenkette mit dem Eingabedatum zu analysieren. Da ein
  24. lokalisiertes Datum nicht alle Teile eines Datums oder einer Zeit enthalten muß, sind alle Schüssel
  25. Paare des Arrays optional. Wenn zum Beispiel nur Jahr, Monat und Tag gegeben sind, dann werden alle
  26. Zeit Werte beim zurückgegebenen Array unterdrückt und umgekehrt wenn nur Stunde, Minute und Sekunde
  27. als Eingabe angegeben werden. Wenn weder ein Datum noch eine Zeit in der Eingabe gefunden werden,
  28. dann wird eine Ausnahme geworfen.
  29. </para>
  30. <para>
  31. Wenn <code>setOption(array('fix_date' => true))</code> gesetzt wird, enthält die Methode <code>getDate()</code>
  32. einen Schlüssel 'fixed' der eine Zahl enthält welche anzeigt ob die eingegebene Zeichenkette korrigiert
  33. wurde indem Tag, Monat oder Jahr getauscht wurden um in das Format zu passen das angegeben wurde.
  34. </para>
  35. <table id="zend.locale.date.normalize.table-1">
  36. <title>Schlüsselwerte für getDate() mit der Option 'fix_date'</title>
  37. <tgroup cols='2'>
  38. <thead>
  39. <row>
  40. <entry>Wert</entry>
  41. <entry>Bedeutung</entry>
  42. </row>
  43. </thead>
  44. <tbody>
  45. <row>
  46. <entry>0</entry>
  47. <entry>Nichts korrigiert</entry>
  48. </row>
  49. <row>
  50. <entry>1</entry>
  51. <entry>Falsches Monat wurde korrigiert</entry>
  52. </row>
  53. <row>
  54. <entry>2</entry>
  55. <entry>Tag und Jahr wurden getauscht</entry>
  56. </row>
  57. <row>
  58. <entry>3</entry>
  59. <entry>Monat und Jahr wurden getauscht</entry>
  60. </row>
  61. <row>
  62. <entry>4</entry>
  63. <entry>Monat und Tag wurden getauscht</entry>
  64. </row>
  65. </tbody>
  66. </tgroup>
  67. </table>
  68. <para>
  69. Für jene die ein spezielles Format für Datumseingaben definieren müssen, werden die nachfolgend
  70. angegebenen Format Zeichen unterstützt. Wenn ein ungültiges Format Zeichen verwendet wird, so wie
  71. PHP's 'i' Zeichen in einem ISO Format, dann wird ein Fehler von den Methoden, die benutzer definierte
  72. Formate in <classname>Zend_Locale_Format</classname> unterstützen, geworfen.
  73. </para>
  74. <para>
  75. Die unten angegebenen Zeichen sind nur ein kleiner Teil des kompletten "ISO" Sets welches von
  76. <classname>Zend_Date</classname>'s <code>toString()</code> unterstützt werden. Wenn PHP <code>date()</code> kompatible
  77. Format Zeichen benutzt werden müssen, dann muß zuerst <code>setOptions(array('format_type' => 'php'))</code>
  78. aufgerufen werden. Und wenn eine spezielle Format Zeichenkette vom PHP <code>date()</code> kompatiblen
  79. Format in ein "ISO" Format konvertiert werden muß kann <code>convertPhpToIsoFormat()</code>
  80. benutzt werden. Aktuell besteht die einzige praktische Differenz darin dass das Zeichen für
  81. Minuten unterschiedlich ist ('m' wird im ISO Format und 'i' im PHP date Format verwendet).
  82. </para>
  83. <table id="zend.locale.date.normalize.table-2">
  84. <title>Rückgabewerte</title>
  85. <tgroup cols='5'>
  86. <thead>
  87. <row>
  88. <entry>getDate() Format Zeichen</entry>
  89. <entry>Array Schlüssel</entry>
  90. <entry>Rückgabewert</entry>
  91. <entry>Minimum</entry>
  92. <entry>Maximum</entry>
  93. </row>
  94. </thead>
  95. <tbody>
  96. <row>
  97. <entry>d</entry>
  98. <entry>day</entry>
  99. <entry>Integer</entry>
  100. <entry>1</entry>
  101. <entry>31</entry>
  102. </row>
  103. <row>
  104. <entry>M</entry>
  105. <entry>month</entry>
  106. <entry>Integer</entry>
  107. <entry>1</entry>
  108. <entry>12</entry>
  109. </row>
  110. <row>
  111. <entry>y</entry>
  112. <entry>year</entry>
  113. <entry>Integer</entry>
  114. <entry>kein Limit</entry>
  115. <entry>PHP's Maximum für Integer</entry>
  116. </row>
  117. <row>
  118. <entry>h</entry>
  119. <entry>hour</entry>
  120. <entry>Integer</entry>
  121. <entry>0</entry>
  122. <entry>PHP's Maximum für Integer</entry>
  123. </row>
  124. <row>
  125. <entry>m</entry>
  126. <entry>minute</entry>
  127. <entry>Integer</entry>
  128. <entry>0</entry>
  129. <entry>PHP's Maximum für Integer</entry>
  130. </row>
  131. <row>
  132. <entry>s</entry>
  133. <entry>second</entry>
  134. <entry>Integer</entry>
  135. <entry>0</entry>
  136. <entry>PHP's Maximum für Integer</entry>
  137. </row>
  138. </tbody>
  139. </tgroup>
  140. </table>
  141. <example id="zend.locale.date.normalize.example-1">
  142. <title>Normalisieren von Daten</title>
  143. <programlisting role="php"><![CDATA[
  144. $dateString = Zend_Locale_Format::getDate('13.04.2006',
  145. array('date_format' =>
  146. 'dd.MM.yyyy')
  147. );
  148. // Erstellt ein Zend_Date Objekt für dieses Datum
  149. $dateObject = Zend_Date('13.04.2006',
  150. array('date_format' => 'dd.MM.yyyy'));
  151. print_r($dateString); // Ausgabe
  152. Array
  153. (
  154. [format] => dd.MM.yyyy
  155. [day] => 13
  156. [month] => 4
  157. [year] => 2006
  158. )
  159. // Alternativ können einige Arten von Problemen mit
  160. // den Eingabedaten automatisch korrigiert werden
  161. $date = Zend_Locale_Format::getDate('04.13.2006',
  162. array('date_format' => 'dd.MM.yyyy',
  163. 'fix_date' => true)
  164. );
  165. print_r($date); // Ausgabe
  166. Array
  167. (
  168. [format] => dd.MM.yyyy
  169. [day] => 13
  170. [month] => 4
  171. [year] => 2006
  172. [fixed] => 4
  173. )
  174. ]]></programlisting>
  175. </example>
  176. <para>
  177. Da <code>getDate()</code> "lokalisierbar" ist, ist die Angabe von <code>$locale</code> ausreichend um
  178. Datumseingaben einem Gebietsschema Format zuzuordnen. Die Option '<code>fix_date</code>' verwendet
  179. einfache Tests um herauszufinden ob Tag oder Monat ungültig sind, um dann eine Heuristik anzuwenden
  180. die versucht alle gefundenen Probleme zu korrigieren. Anzumerken ist auch die Verwendung von
  181. '<classname>Zend_Locale_Format::STANDARD</classname>' als Wert für '<code>date_format</code>' bei der Funktion
  182. <code>setOptions()</code> um zu verhindern das das klassenweit gesetzte standardmäßige Datumsformat
  183. verwendet wird. Das zwingt getDate dazu das standardmäßige Datumsformat dieser <code>$locale</code>
  184. zu verwenden.
  185. </para>
  186. <example id="zend.locale.date.normalize.example-2">
  187. <title>Normalisieren eines Datums durch ein Gebietsschema</title>
  188. <programlisting role="php"><![CDATA[
  189. $locale = new Zend_Locale('de_AT');
  190. $date = Zend_Locale_Format::getDate('13.04.2006',
  191. array('date_format' =>
  192. Zend_Locale_Format::STANDARD,
  193. 'locale' => $locale)
  194. );
  195. print_r ($date);
  196. ]]></programlisting>
  197. </example>
  198. <para>
  199. Ein komplettes Datum mit Uhrzeit wird zurückgegeben, wenn die Eingabe beides, ein Datum und eine
  200. Uhrzeit, um erwarteten Format enthält.
  201. </para>
  202. <example id="zend.locale.date.normalize.example-3">
  203. <title>Normalisieren eines Datums mit Uhrzeit</title>
  204. <programlisting role="php"><![CDATA[
  205. $locale = new Zend_Locale('de_AT');
  206. $date = Zend_Locale_Format::getDate('13.04.2005 22:14:55',
  207. array('date_format' =>
  208. Zend_Locale_Format::STANDARD,
  209. 'locale' => $locale
  210. );
  211. print_r ($date);
  212. ]]></programlisting>
  213. </example>
  214. <para>
  215. Wenn ein spezielles Format gewünscht ist, muß das <code>$format</code> Argument definiert werden, ohne
  216. der Angabe von <code>$locale</code>. Nur die einzelnen Zeichen (H, m, s, y, M, d), und MMMM und EEEE
  217. werden bei <code>$format</code> unterstützt.
  218. </para>
  219. <example id="zend.locale.date.normalize.example-4">
  220. <title>Normalisieren eines Benutzerdefinierten Datums</title>
  221. <programlisting role="php"><![CDATA[
  222. $date = Zend_Locale_Format::getDate('13200504T551422',
  223. array('date_format' =>
  224. 'ddyyyyMM ssmmHH')
  225. );
  226. print_r ($date);
  227. ]]></programlisting>
  228. </example>
  229. <para>
  230. Ein Format kann die folgenden Zeichen enthalten:
  231. </para>
  232. <table id="zend.locale.date.normalize.table-3">
  233. <title>Format Definition</title>
  234. <tgroup cols='2'>
  235. <thead>
  236. <row>
  237. <entry>Format Buchstabe</entry>
  238. <entry>Beschreibung</entry>
  239. </row>
  240. </thead>
  241. <tbody>
  242. <row>
  243. <entry>d oder dd</entry>
  244. <entry>Tag mit 1 oder 2 Ziffern</entry>
  245. </row>
  246. <row>
  247. <entry>M oder MM</entry>
  248. <entry>Monat mit 1 oder 2 Ziffern</entry>
  249. </row>
  250. <row>
  251. <entry>y oder yy</entry>
  252. <entry>Jahr mit 1 or 2 Ziffern</entry>
  253. </row>
  254. <row>
  255. <entry>yyyy</entry>
  256. <entry>Jahr mit 4 Ziffern</entry>
  257. </row>
  258. <row>
  259. <entry>h</entry>
  260. <entry>Stunde mit 1 oder 2 Ziffern</entry>
  261. </row>
  262. <row>
  263. <entry>m</entry>
  264. <entry>Minute mit 1 oder 2 Ziffern</entry>
  265. </row>
  266. <row>
  267. <entry>s</entry>
  268. <entry>Sekunde mit 1 oder 2 Ziffern</entry>
  269. </row>
  270. </tbody>
  271. </tgroup>
  272. </table>
  273. <para>
  274. Beispiele für gültige Formate sind
  275. </para>
  276. <table id="zend.locale.date.normalize.table-4">
  277. <title>Beispielformate</title>
  278. <tgroup cols='3'>
  279. <thead>
  280. <row>
  281. <entry>Formate</entry>
  282. <entry>Eingabe</entry>
  283. <entry>Ausgabe</entry>
  284. </row>
  285. </thead>
  286. <tbody>
  287. <row>
  288. <entry>dd.MM.yy</entry>
  289. <entry>1.4.6</entry>
  290. <entry>['day'] => 1,
  291. ['month'] => 4,
  292. ['year'] => 6</entry>
  293. </row>
  294. <row>
  295. <entry>dd.MM.yy</entry>
  296. <entry>01.04.2006</entry>
  297. <entry>['day'] => 1, ['month'] => 4, ['year'] => 2006</entry>
  298. </row>
  299. <row>
  300. <entry>yyyyMMdd</entry>
  301. <entry>1.4.6</entry>
  302. <entry>['day'] => 6, ['month'] => 4, ['year'] => 1</entry>
  303. </row>
  304. </tbody>
  305. </tgroup>
  306. </table>
  307. <note>
  308. <title>Datumsformate für Datenbanken</title>
  309. <para>
  310. Um einen Datumswert einer Datenbank zu analysieren (zum Beispiel MySql oder MsSql) sollte
  311. <classname>Zend_Date</classname>'s ISO_8601 Format statt getDate() benutzt werden.
  312. </para>
  313. </note>
  314. <para>
  315. Die Option '<code>fix_date</code>' benutzt einfache Tests um herauszufinden ob der Tag oder das
  316. Monat ungültig sind, und wendet dann eine Heuristik an die versucht die erkannten Probleme zu
  317. beheben. <code>getDate()</code> erkennt und behebt automatisch einige Problem mit falschen
  318. Eingabe, wie zum Beispiel ein falsch plaziertes Jahr:
  319. </para>
  320. <example id="zend.locale.date.normalize.example-5">
  321. <title>Automatische Korrektur von Datumsangaben</title>
  322. <programlisting role="php"><![CDATA[
  323. $date = Zend_Locale_Format::getDate('41.10.20',
  324. array('date_format' => 'ddMMyy',
  325. 'fix_date' => true)
  326. );
  327. // Statt 41 für den Tag wird die 41 als Wert für das Jahr zurück gegeben
  328. print_r ($date);
  329. ]]></programlisting>
  330. </example>
  331. </sect2>
  332. <sect2 id="zend.locale.date.test">
  333. <title>Testen von Daten</title>
  334. <para>
  335. <code>checkDateFormat($inputString, array('date_format' => $format, $locale))</code> kann benutzt werden
  336. um zu prüfen ob eine Zeichenkette alle erwarteten Datumsteile enthält. Die Methode
  337. <code>checkDateFormat()</code> benutzt <code>getDate()</code> aber ohne die Verwendung der Option
  338. <code>'fixdate'</code> um zu verhindern das wahr zurück gegeben wird wenn die Eingabe nicht dem
  339. Datumsformat entspricht. Wenn Fehler in der Eingabe gefunden werden, wie zum Beispiel getauschte
  340. Werte für Monat oder Jahr, wendet die Option <code>'fixdate'</code> eine Heuristik an um das
  341. "richtige" Datum zu eruieren bevor dieses auf Gültigkeit geprüft wird.
  342. </para>
  343. <example id="zend.locale.date.test.example-1">
  344. <title>Testen von Daten</title>
  345. <programlisting role="php"><![CDATA[
  346. $locale = new Zend_Locale('de_AT');
  347. // Standard Datumsformate für 'de_AT' benutzen... ist es ein gültiges Datum ?
  348. if (Zend_Locale_Format::checkDateFormat('13.Apr.2006',
  349. array('date_format' =>
  350. Zend_Locale_Format::STANDARD,
  351. $locale)
  352. ) {
  353. print "Datum";
  354. } else {
  355. print "kein Datum";
  356. }
  357. ]]></programlisting>
  358. </example>
  359. </sect2>
  360. <sect2 id="zend.locale.time.normalizing">
  361. <title>Normalisieren von Zeiten</title>
  362. <para>
  363. Normalerweise werden Zeiten zusammen mit einem Datum zurückgegeben, wenn die Eingabe beide Werte
  364. enthält. Wenn das richtige Format nicht bekannt ist, aber das Gebietsschema für die Eingabe des Benutzers
  365. bekannt ist, sollte <code>getTime()</code> verwendet werden, weil es das standardmäßige Zeitformat für
  366. das ausgewählte Gebietsschema benutzt.
  367. </para>
  368. <example id="zend.locale.time.normalizing.example-1">
  369. <title>Normalisieren einer unbekannten Zeit</title>
  370. <programlisting role="php"><![CDATA[
  371. $locale = new Zend_Locale('de_AT');
  372. if (Zend_Locale_Format::getTime('13:44:42',
  373. array('date_format' =>
  374. Zend_Locale_Format::STANDARD,
  375. 'locale' => $locale)
  376. ) {
  377. print "Zeit";
  378. } else {
  379. print "keine Zeit";
  380. }
  381. ]]></programlisting>
  382. </example>
  383. </sect2>
  384. <sect2 id="zend.locale.time.test">
  385. <title>Testen von Zeiten</title>
  386. <para>
  387. <code>checkDateFormat()</code> kann verwendet werden um zu prüfen ob eine Zeichenkette eine
  388. gültige Zeit enthält. Die Verwendung ist genau die gleiche wie beim Prüfen von Daten und
  389. <code>date_format</code> sollte die Teile enthalten von denen erwartet wird das man Sie erhält.
  390. </para>
  391. <example id="zend.locale.time.test.example-1">
  392. <title>Testen einer Zeit</title>
  393. <programlisting role="php"><![CDATA[
  394. $locale = new Zend_Locale('de_AT');
  395. if (Zend_Locale_Format::checkDateFormat('13:44:42',
  396. array('date_format' => 'HH:mm:ss',
  397. 'locale' => $locale)) {
  398. print "Zeit";
  399. } else {
  400. print "keine Zeit";
  401. }
  402. ]]></programlisting>
  403. </example>
  404. </sect2>
  405. </sect1>