Zend_Locale-DatesTimes.xml 19 KB

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