Zend_Date-Additional.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: 21829 -->
  4. <sect1 id="zend.date.additional">
  5. <title>Funktionierende Beispiele</title>
  6. <para>
  7. In diesem Kapitel werden verschiedene zusätzliche Funkionen beschrieben welche auch durch
  8. <classname>Zend_Date</classname> verfügbar sind. Natürlich sind für alle beschriebenen
  9. Funktionen auch Beispiele vorhanden, um die Arbeitsweise und die einfache
  10. <acronym>API</acronym> für die richtige Benutzung zu zeigen.
  11. </para>
  12. <sect2 id="zend.date.additional.checking">
  13. <title>Prüfen von Daten</title>
  14. <para>
  15. Normalerweise werden die meisten Daten als Zeichenketten übergeben. Aber das Problem
  16. mit Zeichenketten ist, dass man nicht sicher sein kann, ob eine Zeichenkette ein echtes
  17. Datum enthält. Hierfür gibt es in <classname>Zend_Date</classname> eine eigene
  18. statische Funktion um Datums-Zeichenketten zu prüfen.
  19. <classname>Zend_Locale</classname> hat eine eigene Funktion
  20. <methodname>getDate($date, $locale)</methodname>, welche ein Datum analysiert und
  21. die gültigen normalisierten Datumsabschnitte zurück gibt. Ein Monatsname wird zum
  22. Beispiel erkannt und anschließend nur die Nummer des Monats zurück gegeben. Da
  23. <classname>Zend_Locale</classname> lediglich eine Klasse zum Normalisieren und
  24. Lokalisieren ist und somit keine Kenntnis über die Daten hat, wurde die Funktion
  25. <methodname>isDate($date)</methodname> integriert, welche dies prüfen kann.
  26. </para>
  27. <para>
  28. <methodname>isDate($date, $format, $locale)</methodname> nimmt bis zu drei Parameter
  29. entgegen und benötigt mindestens einen Parameter. Deshalb ist alles, was für die Prüfung
  30. eines Datums benötigt wird, das Datum selbst als Zeichenkette. Der zweite Parameter kann
  31. das Format sein, in welchem das Datum erwartet wird. Wenn kein Format angegeben wurde,
  32. wird das Standardformat des verwendeten Gebietsschemas benutzt. Details darüber, wie
  33. Formate aussehen müssen, sind im Kapitel über
  34. <link linkend="zend.date.constants.selfdefinedformats">selbst definierte Formate</link>
  35. nachzulesen.
  36. </para>
  37. <para>
  38. Der dritte Parameter ist, wie schon der zweite Parameter, optional und kann für die
  39. Angabe eines Gebietsschemas verwendet werden. Das Gebietsschema wird zur Normalisierung
  40. von Monats- und Wochentagsnamen benötigt. Mit der Angabe des dritten Parameters ist es
  41. also möglich, Daten wie '<command>01.Jänner.2000</command>' oder
  42. '<command>01.January.2000</command>' abhängig vom angegebenen Gebietsschema, zu
  43. erkennen.
  44. </para>
  45. <para>
  46. <methodname>isDate()</methodname> prüft auch ob ein Datum existiert.
  47. <classname>Zend_Date</classname> selbst prüft die Daten nicht. Deshalb ist es möglich
  48. ein Datum wie zum Beispiel '<command>31.Februar.2000</command>' mit
  49. <classname>Zend_Date</classname> zu erstellen, da <classname>Zend_Date</classname> das
  50. Datum automatisch korrigiert und eine gültige Datumsangabe zurück gibt. In unserem Fall
  51. den '<command>03.März.2000</command>'. Auf der anderen Seite führt
  52. <methodname>isDate()</methodname> diese Prüfung durch und gibt beim
  53. '<command>31.Februar.2000</command>' <constant>FALSE</constant> zurück, weil sie weiß
  54. das dieses Datum unmöglich ist.
  55. </para>
  56. <example id="zend.date.additional.checking.example-1">
  57. <title>Prüfen von Daten</title>
  58. <programlisting language="php"><![CDATA[
  59. // Prüfen des Datums
  60. $date = '01.03.2000';
  61. if (Zend_Date::isDate($date)) {
  62. print "Zeichenkette $date ist ein Datum";
  63. } else {
  64. print "Zeichenkette $date ist KEIN Datum";
  65. }
  66. // Prüfen eines lokalisierten Datums
  67. $date = '01 February 2000';
  68. if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) {
  69. print "Zeichenkette $date ist ein Datum";
  70. } else {
  71. print "Zeichenkette $date ist KEIN Datum";
  72. }
  73. // Prüfen eines unmöglichen Datums
  74. $date = '30 February 2000';
  75. if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) {
  76. print "Zeichenkette $date ist ein Datum";
  77. } else {
  78. print "Zeichenkette $date ist KEIN Datum";
  79. }
  80. ]]></programlisting>
  81. </example>
  82. </sect2>
  83. <sect2 id="zend.date.additional.sunrise-sunset">
  84. <title>Sonnenaufgang und Sonnenuntergang</title>
  85. <para>
  86. <classname>Zend_Date</classname> beinhaltet auch Funktionen um Informationen zur
  87. Sonne zu erhalten. Oft ist es notwendig, die Zeit für Sonnenaugang oder Sonnenuntergang
  88. für einen bestimmten Tag zu erhalten. Das ist mit <classname>Zend_Date</classname> sehr
  89. einfach, da nur der gewünschte Tag und die Ortsangabe für den Sonnenaufgang oder
  90. Sonnenuntergang angegeben werden muss.
  91. </para>
  92. <para>
  93. Da die meisten Personen die genaue Ortsangabe Ihrer Stadt nicht kennen, wird eine
  94. eine Helferklasse bereitgestellt, die für etwa 250 Haupt- und Großstädte der ganzen Welt
  95. die Daten der Ortsangaben bereithält. Die meisten Personen können Städte in Ihrer
  96. näheren Umgebung benutzen, da die Differenz für Ortsangaben, welche nahe beineinander
  97. liegen, nur in Sekunden gemessen werden kann.
  98. </para>
  99. <para>
  100. Für die Erstellung einer Auswahlbox und der Auswahl einer speziellen Stadt kann die
  101. Funktion <methodname>Zend_Date_Cities::getCityList()</methodname> benutzt werden. Sie
  102. gibt die Namen aller verfügbaren vordefinierten Städte der Helferklasse zurück.
  103. </para>
  104. <example id="zend.date.additional.sunrise-sunset.example-1">
  105. <title>Alle verfügbaren Städte ausgeben</title>
  106. <programlisting language="php"><![CDATA[
  107. // Ausgabe der kompletten Liste aller verfügbaren Städte
  108. print_r (Zend_Date_Cities::getCityList());
  109. ]]></programlisting>
  110. </example>
  111. <para>
  112. Die Ortsangabe selbst erhält man mit der Funktion
  113. <methodname>Zend_Date_Cities::city()</methodname>. Sie akzeptiert den Namen einer Stadt
  114. wie durch die Funktion <methodname>Zend_Date_Cities::getCityList()</methodname>
  115. angegeben und optional als zweiten Parameter für den zu setzenden Horizont.
  116. </para>
  117. <para>
  118. Es gibt 4 vordefinierte Horizonte, welche mit einer Ortsangabe benutzt werden können, um
  119. den genauen Zeitpunkt von Sonnenauf- und -untergang zu erhalten. Der
  120. '<varname>$horizon</varname>' Parameter ist in allen Funktionen immer optional. Wenn er
  121. nicht gesetzt wird, wird der '<property>effective</property>' Horizont benutzt.
  122. </para>
  123. <table id="zend.date.additional.sunrise-sunset.table">
  124. <title>Arten von unterstützten Horizonten für Sonnenauf- und -untergang</title>
  125. <tgroup cols="3">
  126. <thead>
  127. <row>
  128. <entry>Horizont</entry>
  129. <entry>Beschreibung</entry>
  130. <entry>Verwendung</entry>
  131. </row>
  132. </thead>
  133. <tbody>
  134. <row>
  135. <entry>effective</entry>
  136. <entry>Standard Horizont</entry>
  137. <entry>
  138. Nimmt an das die Welt ein Ball ist. Dieser Horizont wird immer benutzt
  139. wenn keiner definiert wurde.
  140. </entry>
  141. </row>
  142. <row>
  143. <entry>civil</entry>
  144. <entry>Üblicher Horizont</entry>
  145. <entry>Oft in den üblichen Medien wie Fernsehen und Radio benutzt.</entry>
  146. </row>
  147. <row>
  148. <entry>nautic</entry>
  149. <entry>Nautischer Horizont</entry>
  150. <entry>Oft in der Navigation zu See benutzt.</entry>
  151. </row>
  152. <row>
  153. <entry>astronomic</entry>
  154. <entry>Astronomischer Horizont</entry>
  155. <entry>Oft bei der Berechnung mit Sternen benutzt</entry>
  156. </row>
  157. </tbody>
  158. </tgroup>
  159. </table>
  160. <para>
  161. Natürlich kann auch eine selbst-definierte Ortsangabe für die Berechnung benutzt werden.
  162. Hierzu ist eine '<property>latitude</property>' und eine
  163. '<property>longitude</property>' anzugeben und optional der
  164. '<property>horizon</property>'.
  165. </para>
  166. <example id="zend.date.additional.sunrise-sunset.example-2">
  167. <title>Die Ortsangabe für eine Stadt auslesen</title>
  168. <programlisting language="php"><![CDATA[
  169. // Die Ortsangabe für eine bestimmte Stadt auslesen
  170. // Benutzt den effektiven Horizont da kein Horizont angegeben wurde
  171. print_r (Zend_Date_Cities::city('Vienna'));
  172. // Benutzt den nautischen Horizont
  173. print_r (Zend_Date_Cities::city('Vienna', 'nautic'));
  174. // Selbstdefinition einer Ortsangabe
  175. $mylocation = array('latitude' => 41.5, 'longitude' => 13.2446);
  176. ]]></programlisting>
  177. </example>
  178. <para>
  179. Da nun alle benötigten Daten angegeben werden können, ist der nächste Schritt die
  180. Erstellung eines <classname>Zend_Date</classname> Objekts mit dem Tag, für welchen
  181. Sonnenauf- oder -untergang berechnet werden sollen. Für die Berechnung stehen 3
  182. Funktionen bereit. Die Berechnung des Sonnenaufganges ist mit
  183. '<methodname>getSunset()</methodname>', des Sonnenuntergangs mit
  184. '<methodname>getSunrise()</methodname>' und alle möglichen Informationen, welche die
  185. Sonne betreffen mit '<methodname>getSunInfo()</methodname>' möglich. Nach der
  186. Berechnung wird das <classname>Zend_Date</classname> Objekt mit der berechneten Zeit
  187. zurückgegeben.
  188. </para>
  189. <example id="zend.date.additional.sunrise-sunset.example-3">
  190. <title>Berechnung von Sonneninformationen</title>
  191. <programlisting language="php"><![CDATA[
  192. // Die Ortsangabe einer bestimmten Stadt auslesen
  193. $city = Zend_Date_Cities::city('Vienna');
  194. // Ein Datumsobjekt erstellen für den Tag
  195. // für den die Sonne berechnet werden soll
  196. $date = new Zend_Date('10.03.2007', Zend_Date::ISO_8601, 'de');
  197. // Sonnenuntergang berechnen
  198. $sunset = $date->getSunset($city);
  199. print $sunset->get(Zend_Date::ISO_8601);
  200. // Alle Sonneninformationen berechnen
  201. $info = $date->getSunInfo($city);
  202. foreach ($info as $sun) {
  203. print "\n" . $sun->get(Zend_Date::ISO_8601);
  204. }
  205. ]]></programlisting>
  206. </example>
  207. </sect2>
  208. <sect2 id="zend.date.additional.timezones">
  209. <title>Zeitzonen</title>
  210. <para>
  211. Zeitzonen sind genauso wichtig wie die Datumsangaben selbst. Es gibt einige Zeitzonen
  212. abhängig vom Aufenthaltsort des Nutzers. Deshalb bedeutet das Arbeiten mit
  213. Daten auch immer, dass eine gültige Zeitzone gesetzt ist. Das klingt eventuell
  214. kompliziert, ist aber viel einfacher als erwartet. Wie schon im ersten Kapitel von
  215. <classname>Zend_Date</classname> erwähnt, muss immer eine Standardzeitzone gesetzt
  216. werden. Dies kann entweder in der <filename>php.ini</filename> oder durch Definition in
  217. der Bootstrap Datei durchgeführt werden.
  218. </para>
  219. <para>
  220. Ein <classname>Zend_Date</classname> Objekt speichert die aktuelle Zeitzone.
  221. Selbst wenn die Zeitzone nach der Erstellung des Objektes geändert wird, merkt sich das
  222. Objekt die originale Zeitzone und arbeitet mit dieser. Es ist also nicht notwendig, die
  223. Zeitzone im Code mithilfe von <acronym>PHP</acronym> Funktionen zu ändern.
  224. <classname>Zend_Date</classname> hat zwei eingebaute Funktionen, die es ermöglichen
  225. damit zu arbeiten.
  226. </para>
  227. <para>
  228. <methodname>getTimezone()</methodname> gibt die aktuell gesetzte Zeitzone des
  229. <classname>Zend_Date</classname> Objektes zurück. Man sollte in Erinnerung behalten,
  230. dass <classname>Zend_Date</classname> nicht mit den <acronym>PHP</acronym> Internas
  231. gekoppelt ist. Deshalb ist die zurückgegebene Zeitzone nicht die des
  232. <acronym>PHP</acronym> Skripts, sondern jene des Objektes.
  233. <methodname>setTimezone($zone)</methodname> ist die zweite Funktion und ermöglicht es
  234. eine neue Zeitzone für <classname>Zend_Date</classname> zu setzen. Eine angegebene
  235. Zeitzone wird immer geprüft. Wenn diese nicht existiert, wird eine Ausnahme geworfen.
  236. Zusätzlich kann die Zeitzone des aktuellen Skripts oder des Systems für das Datumsobjekt
  237. gesetzt werden, indem <methodname>setTimezone()</methodname> ohne den Parameter zone
  238. aufgerufen wird. Das wird auch automatisch gemacht, wenn das Datumsobjekt erstellt wird.
  239. </para>
  240. <example id="zend.date.additional.timezones.example-1">
  241. <title>Arbeiten mit Zeitzonen</title>
  242. <programlisting language="php"><![CDATA[
  243. // Setzen einer Standardzeitzone... das muß in der Bootstrap Datei
  244. // oder php.ini gemacht werden. Wir setzen diese hier nur der Vollständigkeit
  245. // halber, um ein komplettes Beispiel zu erhalten.
  246. date_default_timezone_set('Europe/Vienna');
  247. // Erstellen des Datumsobjektes
  248. $date = new Zend_Date('10.03.2007', Zend_Date::DATES, 'de');
  249. // Ausgabe des Datumsobjektes
  250. print $date->getIso();
  251. // Welche Zeitzone ist gesetzt ?
  252. print $date->getTimezone();
  253. // Setzen einer anderen Zeitzone
  254. $date->setTimezone('America/Chicago');
  255. // Welche Zeitzone ist jetzt gesetzt ?
  256. print $date->getTimezone();
  257. // Ausgabe des geänderten Datumsobjektes
  258. print $date->getIso();
  259. ]]></programlisting>
  260. </example>
  261. <para>
  262. <classname>Zend_Date</classname> nimmt immer die aktuelle Zeitzone für das Erstellen
  263. eines Objektes, wie in den ersten Zeilen des Beispiels gezeigt. Das Ändern der Zeitzone
  264. für ein erstelltes Objekt hat einen Effekt auf das Datum selbst. Daten sind immer
  265. relativ zu einer Zeitzone. Das Ändern der Zeitzone für ein
  266. <classname>Zend_Date</classname> Objekt ändert nicht die Zeit des
  267. <classname>Zend_Date</classname> Objektes selbst. Man muß sich in Erinnerung halten,
  268. dass Daten intern immer als Zeitpunkte und in der <acronym>GMT</acronym> gespeichert
  269. werden. Eine Zeitzone bedeutet also wieviele Stunden subtrahiert oder addiert werden
  270. müssen, um die aktuelle globale Zeit für die eigene Zeitzone und Region zu erhalten.
  271. </para>
  272. <para>
  273. Das Koppeln der Zeitzone innerhalb von <classname>Zend_Date</classname> hat einen
  274. anderen positiven Nebeneffekt. Es ist möglich verschiedene Daten mit verschiedenen
  275. Zeitzonen zu haben.
  276. </para>
  277. <example id="zend.date.additional.timezones.example-2">
  278. <title>Mehrere Zeitzonen</title>
  279. <programlisting language="php"><![CDATA[
  280. // Setzen einer Standardzeitzone... das muß in der Bootstrap Datei oder
  281. // php.ini gemacht werden. Wir setzen diese hier nur der Vollständigkeit
  282. // halber, um ein komplettes Beispiel zu erhalten.
  283. date_default_timezone_set('Europe/Vienna');
  284. // Erstellen des Datumsobjektes
  285. $date = new Zend_Date('10.03.2007 00:00:00', Zend_Date::ISO_8601, 'de');
  286. // Ausgabe des Datumsobjektes
  287. print $date->getIso();
  288. // Das Datum bleibt unverändert selbst nach einer Änderung der Zeitzone
  289. date_default_timezone_set('America/Chicago');
  290. print $date->getIso();
  291. $otherdate = clone $date;
  292. $otherdate->setTimezone('Brazil/Acre');
  293. // Ausgabe des Datumsobjektes
  294. print $otherdate->getIso();
  295. // Setzen der aktuellen Zeitzone des Systems für das Objekt
  296. $lastdate = clone $date;
  297. $lastdate->setTimezone();
  298. // Ausgabe des Datumsobjektes
  299. print $lastdate->getIso();
  300. ]]></programlisting>
  301. </example>
  302. </sect2>
  303. </sect1>