Zend_Date-Additional.xml 16 KB

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