Zend_Date-Additional.xml 15 KB

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