Zend_Date-Additional.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.date.additional">
  5. <title>Exemples concrets</title>
  6. <para>
  7. Dans ce chapitre, nous décrirons plusieurs fonctionnalités disponibles dans
  8. <classname>Zend_Date</classname>. Ceci sera fait au travers d'exemples concrets.
  9. </para>
  10. <sect2 id="zend.date.additional.checking">
  11. <title>Vérifier des dates</title>
  12. <para>
  13. La plupart du temps vous devrez traiter des dates issues d'entrées de vos
  14. scripts, sous forme de chaînes de caractères. Le problème avec les chaînes est que l'on
  15. ne sait pas si elles représentent réellement une date. Ainsi,
  16. <classname>Zend_Date</classname> possède une méthode statique pour vérifier cela.
  17. <classname>Zend_Locale</classname> a aussi une fonction <code>getDate($date,
  18. $locale);</code> qui analyse et retourne la date correctement normalisée. Le nom d'un
  19. mois, par exemple, sera reconnu et sera retourné comme entier. Étant donnée que le rôle
  20. de <classname>Zend_Locale</classname> est l'aide à la localisation et
  21. l'internationalisation, c'est <classname>Zend_Date</classname> qui propose une fonction
  22. de vérification&#160;:<methodname>isDate($date)</methodname>.
  23. </para>
  24. <para>
  25. <code>isDate($date, $format, $locale);</code> peut prendre jusqu'à 3 paramètres,
  26. 1 seul est obligatoire. Le second paramètre exprime le format dans lequel la date doit
  27. se trouver. Si aucun format n'est spécifié, alors le format par défaut de la locale en
  28. cours sera utilisé. <link linkend="zend.date.constants.selfdefinedformats">Plus
  29. d'infos sur les formats</link>.
  30. </para>
  31. <para>
  32. Le 3ème paramètre est aussi optionnel et peut être utilisé pour spécifier une
  33. locale. Celle-ci est nécessaire afin de normaliser les noms des mois et des jours. Avec
  34. le 3ème paramètre fourni, des dates comme "01.Jänner.2000" ou "01.January.2000"
  35. pourront être reconnues en fonction de la locale passée.
  36. </para>
  37. <para>
  38. <code>isDate();</code> bien sûr, vérifie que la date existe.
  39. <classname>Zend_Date</classname> ne vérifie pas une date elle-même. Il est possible de
  40. créer une date avec "31.February.2000" dans <classname>Zend_Date</classname>,
  41. simplement la date sera convertie automatiquement par <classname>Zend_Date</classname>
  42. en "03.March.2000". <methodname>isDate()</methodname> effectue cette vérification et retournera
  43. <constant>FALSE</constant> sur "31.February.2000" car cette date n'existe pas.
  44. </para>
  45. <example id="zend.date.additional.checking.example-1">
  46. <title>Vérifier des dates</title>
  47. <programlisting language="php"><![CDATA[
  48. // Vérification de dates
  49. $date = '01.03.2000';
  50. if (Zend_Date::isDate($date)) {
  51. print "la chaine $date est une date";
  52. } else {
  53. print "la chaine $date n'est PAS une date";
  54. }
  55. // Vérification de dates localisées
  56. $date = '01 February 2000';
  57. if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) {
  58. print "la chaine $date est une date";
  59. } else {
  60. print "la chaine $date n'est PAS une date";
  61. }
  62. // Vérification de fausses dates
  63. $date = '30 February 2000';
  64. if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) {
  65. print "String $date is a date";
  66. } else {
  67. print "String $date is NO date";
  68. }
  69. ]]></programlisting>
  70. </example>
  71. </sect2>
  72. <sect2 id="zend.date.additional.sunrise-sunset">
  73. <title>Levé et couché du soleil</title>
  74. <para>
  75. <classname>Zend_Date</classname> possède aussi des fonctionnalités pour se
  76. renseigner sur le soleil. Il peut être utile dans une zone donnée, de savoir l'heure de
  77. levé et de couché du soleil. C'est très simple avec <classname>Zend_Date</classname>,
  78. il suffit de lui fournir une date, certes, mais aussi un endroit depuis lequel ces
  79. calculs seront faits.
  80. </para>
  81. <para>
  82. Comme presque personne ne connaît la localisation précise d'une ville sur la
  83. planète, nous avons aussi écrit une classe qui donne ces coordonnées, pour plus de 250
  84. grandes villes et capitales. Ainsi la plupart des gens pourra utiliser des villes
  85. proches de chez eux.
  86. </para>
  87. <para>
  88. A cet effet, <classname>Zend_Date_Cities::getCityList</classname> peut être
  89. utilisée, cette méthode retourne les noms de toutes les villes prédéfinies dans la
  90. classe d'aide.
  91. </para>
  92. <example id="zend.date.additional.sunrise-sunset.example-1">
  93. <title>Récupérer toutes les villes disponibles</title>
  94. <programlisting language="php"><![CDATA[
  95. // Affiche la liste complète de toutes les villes disponibles
  96. // dans la classe d'aide
  97. print_r (Zend_Date_Cities::getCityList());
  98. ]]></programlisting>
  99. </example>
  100. <para>
  101. La localisation peut être récupérée avec
  102. <methodname>Zend_Date_Cities::City()</methodname>. Cette méthode prend en paramètre le
  103. nom d'une ville, tel que retourné par
  104. <methodname>Zend_Date_Cities::getCityList()</methodname>, et un second paramètre
  105. optionnel pour l'horizon.
  106. </para>
  107. <para>
  108. Il y a 4 horizons définis, qui peuvent être utilisés avec des lieux pour
  109. déterminer la date exacte de levé et couché du soleil. Le paramètre
  110. "<code>horizon</code>" est toujours optionnel, quelle que soit la fonction dans
  111. laquelle il est utilisé. S'il n'est pas précisé, la valeur "<code>effective</code>" lui
  112. sera attribuée par défaut.
  113. </para>
  114. <table id="zend.date.additional.sunrise-sunset.table">
  115. <title>Valeurs d'horizons supportées pour les levé et couché de soleil</title>
  116. <tgroup cols="3">
  117. <thead>
  118. <row>
  119. <entry>Horizon</entry>
  120. <entry>Description</entry>
  121. <entry>Usage</entry>
  122. </row>
  123. </thead>
  124. <tbody>
  125. <row>
  126. <entry>effective</entry>
  127. <entry>Standard horizon</entry>
  128. <entry>
  129. Traite la Terre comme une balle. C'est la valeur par
  130. défaut.
  131. </entry>
  132. </row>
  133. <row>
  134. <entry>civil</entry>
  135. <entry>Common horizon</entry>
  136. <entry>
  137. Utilisé dans les médias courants, comme la TV ou la
  138. radio
  139. </entry>
  140. </row>
  141. <row>
  142. <entry>nautic</entry>
  143. <entry>Nautic horizon</entry>
  144. <entry>Utilisé en navigation</entry>
  145. </row>
  146. <row>
  147. <entry>astronomic</entry>
  148. <entry>Astronomic horizon</entry>
  149. <entry>Utilisé pour le calcul avec des étoiles</entry>
  150. </row>
  151. </tbody>
  152. </tgroup>
  153. </table>
  154. <para>
  155. Évidemment, un endroit personnalisé peut aussi être utilisé pour le calcul. Une
  156. "<code>latitude</code>" et une "<code>longitude</code>" seront alors nécessaires, en
  157. plus du paramètre optionnel "<code>horizon</code>".
  158. </para>
  159. <example id="zend.date.additional.sunrise-sunset.example-2">
  160. <title>Trouver la localisation d'une ville</title>
  161. <programlisting language="php"><![CDATA[
  162. // Trouve la localisation d'une ville avec l'horizon effectif
  163. print_r (Zend_Date_Cities::city('Vienna'));
  164. // utilise l'horizon nautique
  165. print_r (Zend_Date_Cities::city('Vienna', 'nautic'));
  166. // Voici une ville personnalisée qui n'est pas dans la liste prédéfinie
  167. $mylocation = array('latitude' => 41.5, 'longitude' => 13.2446);
  168. ]]></programlisting>
  169. </example>
  170. <para>
  171. Dès lors, il faut créer un objet <classname>Zend_Date</classname> contenant la
  172. date dont on veut connaître les informations de levé et de couché du soleil. 3 méthodes
  173. nous seront proposées&#160;: <methodname>getSunset()</methodname>, <methodname>getSunrise()</methodname> et
  174. <methodname>getSunInfo()</methodname>. Ces 3 méthodes s'appliquent sur un objet
  175. <classname>Zend_Date</classname> et retournent un objet
  176. <classname>Zend_Date</classname>.
  177. </para>
  178. <example id="zend.date.additional.sunrise-sunset.example-3">
  179. <title>Calculer les informations relatives au soleil</title>
  180. <programlisting language="php"><![CDATA[
  181. // Retrouve la localisation d'une ville
  182. $city = Zend_Date_Cities::city('Vienna');
  183. // Créer une date à partir de laquelle extraire
  184. // les informations relatives au soleil
  185. $date = new Zend_Date('10.03.2007', Zend_Date::ISO_8601, 'de');
  186. // calcul du levé du soleil
  187. $sunset = $date->getSunset($city);
  188. print $sunset->get(Zend_Date::ISO_8601);
  189. // calcul de toutes les informations solaires
  190. $info = $date->getSunInfo($city);
  191. foreach ($info as $sun) {
  192. print "\n" . $sun->get(Zend_Date::ISO_8601);
  193. }
  194. ]]></programlisting>
  195. </example>
  196. </sect2>
  197. <sect2 id="zend.date.additional.timezones">
  198. <title>Fuseaux horaires (Timezones)</title>
  199. <para>
  200. Les zones de temps (Timezones) sont aussi importantes que les dates en
  201. elles-mêmes. Il existe plusieurs zones de temps (fuseaux horaires) sur la planète, et
  202. travailler avec des dates implique de définir un fuseau horaire pour cette date. Ceci
  203. semble complexe mais c'est plutôt simple. Comme déjà dit dans le premier chapitre sur
  204. <classname>Zend_Date</classname>, le fuseau horaire par défaut de <acronym>PHP</acronym> doit être
  205. configuré. En général, le fichier <code>php.ini</code> est utilisé à cet effet, mais ce
  206. n'est pas l'unique moyen.
  207. </para>
  208. <para>
  209. Un objet <classname>Zend_Date</classname> encapsule son propre fuseau horaire.
  210. Même en changeant le fuseau après la création de l'objet, celui-ci s'en souviendra. De
  211. même, changer le fuseau via <acronym>PHP</acronym> n'aura aucun impact sur l'objet
  212. <classname>Zend_Date</classname> avec lequel un travail est en cours, c'est celui-ci
  213. qui va vous permettre via des méthodes de gérer son fuseau.
  214. </para>
  215. <para>
  216. <methodname>getTimezone()</methodname> retourne le fuseau horaire actuel sur lequel travaille
  217. <classname>Zend_Date</classname>. Souvenez vous que <classname>Zend_Date</classname>
  218. n'est pas lié aux mécanismes interne de <acronym>PHP</acronym>, ainsi le fuseau retourné peut être
  219. différent de celui sur lequel <acronym>PHP</acronym> est réglé.<methodname>setTimezone($zone)</methodname> change le
  220. fuseau horaire actuel de l'objet <classname>Zend_Date</classname>. Le fuseau ainsi
  221. fournit est toujours vérifié, s'il n'existe pas, une exception sera levée. Si vous ne
  222. spécifiez pas de fuseau à cette méthode, alors c'est le fuseau interne de <acronym>PHP</acronym> qui sera
  223. utilisé par défaut, comme c'est le cas lors de la création d'un objet
  224. <classname>Zend_Date</classname> banal.
  225. </para>
  226. <example id="zend.date.additional.timezones.example-1">
  227. <title>Travailler avec les fuseaux horaires (timezones)</title>
  228. <programlisting language="php"><![CDATA[
  229. // Règle le fuseau horaire PHP par défaut.
  230. // En général, celui-ci est réglé dans php.ini.
  231. // Ici nous le faisons pour l'exemple
  232. date_default_timezone_set('Europe/Vienna');
  233. // creation d'un objet date
  234. $date = new Zend_Date('10.03.2007', Zend_Date::DATES, 'de');
  235. // affichage de notre date
  236. print $date->getIso();
  237. // quel est son fuseau horaire ?
  238. print $date->getTimezone();
  239. // affectons un autre fuseau
  240. $date->setTimezone('America/Chicago');
  241. // quel est le fuseau ?
  242. print $date->getTimezone();
  243. // voyons les changements dans la date retournée
  244. print $date->getIso();
  245. ]]></programlisting>
  246. </example>
  247. <para>
  248. <classname>Zend_Date</classname> utilise toujours le fuseau par défaut (de <acronym>PHP</acronym>)
  249. lors de la création de l'instance. Remarquez que changer le fuseau de l'objet a un
  250. impact sur la date s'y trouvant. Une date est toujours exprimée relativement à un
  251. fuseau horaire, changer le fuseau dans l'objet ne change pas la date de l'objet, mais
  252. bien sa représentation. Rappelez vous qu'en interne, les dates sont représentées comme
  253. des timestamps <acronym>GMT</acronym>. Le fuseau donne une information de décalage par rapport à <acronym>GMT</acronym>, en
  254. positif ou négatif.
  255. </para>
  256. <para>
  257. Coupler le fuseau dans l'objet <classname>Zend_Date</classname> a un autre effet
  258. positif&#160;: il est possible de posséder plusieurs objets de date, avec chacun un
  259. fuseau horaire différent.
  260. </para>
  261. <example id="zend.date.additional.timezones.example-2">
  262. <title>Plusieurs fuseaux horaires</title>
  263. <programlisting language="php"><![CDATA[
  264. // Règle le fuseau horaire PHP par défaut.
  265. // En général, celui-ci est réglé dans php.ini
  266. // Ici nous le faisons pour l'exemple
  267. date_default_timezone_set('Europe/Vienna');
  268. // creation d'un objet date
  269. $date = new Zend_Date('10.03.2007 00:00:00', Zend_Date::ISO_8601, 'de');
  270. // affichage de notre date
  271. print $date->getIso();
  272. // La date est inchangée, même si le fuseau PHP l'est
  273. date_default_timezone_set('America/Chicago');
  274. print $date->getIso();
  275. $otherdate = clone $date;
  276. $otherdate->setTimezone('Brazil/Acre');
  277. // affichage de notre date
  278. print $otherdate->getIso();
  279. // affecte le fuseau horaire actuel de PHP, à notre objet date
  280. $lastdate = clone $date;
  281. $lastdate->setTimezone();
  282. // affichage de notre date
  283. print $lastdate->getIso();
  284. ]]></programlisting>
  285. </example>
  286. </sect2>
  287. </sect1>