# 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

    // 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";
    }

## 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

    // 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.

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

    // 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.

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);
    }

## 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)

    // 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.

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();