Dans ce chapitre, nous décrirons plusieurs fonctionnalités disponibles dans
Zend_Date
. Ceci sera fait au travers d'exemples concrets.
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.
Exemple 178. Vérifier des dates
// Vérification de dates $date = '01.03.2000'; if (Zend_Date::isDate($date)) { print "la chaine $date est une date"; } else { print "la chaine $date n'est PAS une date"; } // Vérification de dates localisées $date = '01 February 2000'; if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) { print "la chaine $date est une date"; } else { print "la chaine $date n'est PAS une date"; } // Vérification de fausses dates $date = '30 February 2000'; if (Zend_Date::isDate($date,'dd MMMM yyyy', 'en')) { print "String $date is a date"; } else { print "String $date is NO date"; }
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.
Exemple 179. Récupérer toutes les villes disponibles
// Affiche la liste complète de toutes les villes disponibles // dans la classe d'aide print_r (Zend_Date_Cities::getCityList());
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.
Tableau 62. 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
".
Exemple 180. Trouver la localisation d'une ville
// Trouve la localisation d'une ville avec l'horizon effectif print_r (Zend_Date_Cities::city('Vienna')); // utilise l'horizon nautique print_r (Zend_Date_Cities::city('Vienna', 'nautic')); // Voici une ville personnalisée qui n'est pas dans la liste prédéfinie $mylocation = array('latitude' => 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
.
Exemple 181. Calculer les informations relatives au soleil
// Retrouve la localisation d'une ville $city = Zend_Date_Cities::city('Vienna'); // Créer une date à partir de laquelle extraire // les informations relatives au soleil $date = new Zend_Date('10.03.2007', Zend_Date::ISO_8601, 'de'); // calcul du levé du soleil $sunset = $date->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); }
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.
Exemple 182. Travailler avec les fuseaux horaires (timezones)
// Règle le fuseau horaire PHP par défaut. // En général, celui-ci est réglé dans php.ini. // Ici nous le faisons pour l'exemple date_default_timezone_set('Europe/Vienna'); // creation d'un objet date $date = new Zend_Date('10.03.2007', Zend_Date::DATES, 'de'); // affichage de notre date print $date->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.
Exemple 183. Plusieurs fuseaux horaires
// Règle le fuseau horaire PHP par défaut. // En général, celui-ci est réglé dans php.ini // Ici nous le faisons pour l'exemple date_default_timezone_set('Europe/Vienna'); // creation d'un objet date $date = new Zend_Date('10.03.2007 00:00:00', Zend_Date::ISO_8601, 'de'); // affichage de notre date print $date->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();