Exemples concrets Dans ce chapitre, nous décrirons plusieurs fonctionnalités disponibles dans Zend_Date. Ceci sera fait au travers d'exemples concrets. Vérifier des dates La plupart du temps vous devrez traiter des dates issues d'entrées de vos scripts, sous forme de chaînes de caractères. Le problème avec les chaînes est que l'on ne sait pas si elles représentent réellement une date. Ainsi, Zend_Date possède une méthode statique pour vérifier cela. Zend_Locale a aussi une fonction getDate($date, $locale); qui analyse et retourne la date correctement normalisée. Le nom d'un mois, par exemple, sera reconnu et sera retourné comme entier. Étant donnée que le rôle de Zend_Locale est l'aide à la localisation et l'internationalisation, c'est Zend_Date qui propose une fonction de vérification :isDate($date). isDate($date, $format, $locale); peut prendre jusqu'à 3 paramètres, 1 seul est obligatoire. Le second paramètre exprime le format dans lequel la date doit se trouver. Si aucun format n'est spécifié, alors le format par défaut de la locale en cours sera utilisé. Plus d'infos sur les formats. Le 3ème paramètre est aussi optionnel et peut être utilisé pour spécifier une locale. Celle-ci est nécessaire afin de normaliser les noms des mois et des jours. Avec le 3ème paramètre fourni, des dates comme "01.Jänner.2000" ou "01.January.2000" pourront être reconnues en fonction de la locale passée. isDate(); bien sûr, vérifie que la date existe. Zend_Date ne vérifie pas une date elle-même. Il est possible de créer une date avec "31.February.2000" dans Zend_Date, simplement la date sera convertie automatiquement par Zend_Date en "03.March.2000". isDate() effectue cette vérification et retournera FALSE sur "31.February.2000" car cette date n'existe pas. Vérifier des dates Levé et couché du soleil Zend_Date possède aussi des fonctionnalités pour se renseigner sur le soleil. Il peut être utile dans une zone donnée, de savoir l'heure de levé et de couché du soleil. C'est très simple avec Zend_Date, il suffit de lui fournir une date, certes, mais aussi un endroit depuis lequel ces calculs seront faits. Comme presque personne ne connaît la localisation précise d'une ville sur la planète, nous avons aussi écrit une classe qui donne ces coordonnées, pour plus de 250 grandes villes et capitales. Ainsi la plupart des gens pourra utiliser des villes proches de chez eux. A cet effet, Zend_Date_Cities::getCityList peut être utilisée, cette méthode retourne les noms de toutes les villes prédéfinies dans la classe d'aide. Récupérer toutes les villes disponibles La localisation peut être récupérée avec Zend_Date_Cities::City(). Cette méthode prend en paramètre le nom d'une ville, tel que retourné par Zend_Date_Cities::getCityList(), et un second paramètre optionnel pour l'horizon. Il y a 4 horizons définis, qui peuvent être utilisés avec des lieux pour déterminer la date exacte de levé et couché du soleil. Le paramètre "horizon" est toujours optionnel, quelle que soit la fonction dans laquelle il est utilisé. S'il n'est pas précisé, la valeur "effective" lui sera attribuée par défaut. Valeurs d'horizons supportées pour les levé et couché de soleil Horizon Description Usage effective Standard horizon Traite la Terre comme une balle. C'est la valeur par défaut. civil Common horizon Utilisé dans les médias courants, comme la TV ou la radio nautic Nautic horizon Utilisé en navigation astronomic Astronomic horizon Utilisé pour le calcul avec des étoiles
Évidemment, un endroit personnalisé peut aussi être utilisé pour le calcul. Une "latitude" et une "longitude" seront alors nécessaires, en plus du paramètre optionnel "horizon". Trouver la localisation d'une ville 41.5, 'longitude' => 13.2446); ]]> Dès lors, il faut créer un objet Zend_Date contenant la date dont on veut connaître les informations de levé et de couché du soleil. 3 méthodes nous seront proposées : getSunset(), getSunrise() et getSunInfo(). Ces 3 méthodes s'appliquent sur un objet Zend_Date et retournent un objet Zend_Date. Calculer les informations relatives au soleil getSunset($city); print $sunset->get(Zend_Date::ISO_8601); // calcul de toutes les informations solaires $info = $date->getSunInfo($city); foreach ($info as $sun) { print "\n" . $sun->get(Zend_Date::ISO_8601); } ]]>
Fuseaux horaires (Timezones) Les zones de temps (Timezones) sont aussi importantes que les dates en elles-mêmes. Il existe plusieurs zones de temps (fuseaux horaires) sur la planète, et travailler avec des dates implique de définir un fuseau horaire pour cette date. Ceci semble complexe mais c'est plutôt simple. Comme déjà dit dans le premier chapitre sur Zend_Date, le fuseau horaire par défaut de PHP doit être configuré. En général, le fichier php.ini est utilisé à cet effet, mais ce n'est pas l'unique moyen. Un objet Zend_Date encapsule son propre fuseau horaire. Même en changeant le fuseau après la création de l'objet, celui-ci s'en souviendra. De même, changer le fuseau via PHP n'aura aucun impact sur l'objet Zend_Date avec lequel un travail est en cours, c'est celui-ci qui va vous permettre via des méthodes de gérer son fuseau. getTimezone() retourne le fuseau horaire actuel sur lequel travaille Zend_Date. Souvenez vous que Zend_Date n'est pas lié aux mécanismes interne de PHP, ainsi le fuseau retourné peut être différent de celui sur lequel PHP est réglé.setTimezone($zone) change le fuseau horaire actuel de l'objet Zend_Date. Le fuseau ainsi fournit est toujours vérifié, s'il n'existe pas, une exception sera levée. Si vous ne spécifiez pas de fuseau à cette méthode, alors c'est le fuseau interne de PHP qui sera utilisé par défaut, comme c'est le cas lors de la création d'un objet Zend_Date banal. Travailler avec les fuseaux horaires (timezones) getIso(); // quel est son fuseau horaire ? print $date->getTimezone(); // affectons un autre fuseau $date->setTimezone('America/Chicago'); // quel est le fuseau ? print $date->getTimezone(); // voyons les changements dans la date retournée print $date->getIso(); ]]> Zend_Date utilise toujours le fuseau par défaut (de PHP) lors de la création de l'instance. Remarquez que changer le fuseau de l'objet a un impact sur la date s'y trouvant. Une date est toujours exprimée relativement à un fuseau horaire, changer le fuseau dans l'objet ne change pas la date de l'objet, mais bien sa représentation. Rappelez vous qu'en interne, les dates sont représentées comme des timestamps GMT. Le fuseau donne une information de décalage par rapport à GMT, en positif ou négatif. Coupler le fuseau dans l'objet Zend_Date a un autre effet positif : il est possible de posséder plusieurs objets de date, avec chacun un fuseau horaire différent. Plusieurs fuseaux horaires getIso(); // La date est inchangée, même si le fuseau PHP l'est date_default_timezone_set('America/Chicago'); print $date->getIso(); $otherdate = clone $date; $otherdate->setTimezone('Brazil/Acre'); // affichage de notre date print $otherdate->getIso(); // affecte le fuseau horaire actuel de PHP, à notre objet date $lastdate = clone $date; $lastdate->setTimezone(); // affichage de notre date print $lastdate->getIso(); ]]>