# Créer des dates

`Zend_Date` permet de créer des instances d'elle même de plusieurs manières différentes. Nous allons voir ceci.

## Créer la date actuelle

La manière la plus simple de créer la date actuelle est d'utiliser le constructeur `new Zend_Date()` ou encore la méthode statique `Zend_Date::now()`. Toutes les deux retournent une instance de `Zend_Date` avec la date actuelle. Elle est représentée par une date calendaire et un temps pour le fuseau horaire actuel du serveur.

### Créer une date par instance

Il n'y a pas de paramètres à passer au constructeur pour récupérer un objet `Zend_Date`. Certains paramètres sont cependant disponibles et nous y reviendrons.

    $date = new Zend_Date();

### Créer une date par méthode statique

La méthode statique `now()` a exactement le même effet qu'un passage par le constructeur. Cependant la méthode statique, elle, ne peut pas prendre de paramètres additionnels.

    $date = Zend_Date::now();

## Créer une date depuis une base de données

Les bases de données sont souvent utilisées pour stocker des informations de dates. Mais elles ont toutes une implémentation et une représentation qui leur est propre. MSSQL par exemple manipule les dates de manières significativement différente de MySQL, par exemple. Heureusement, `Zend_Date` aide à simplifier le processus de création d'une date depuis une base de données.

Il est possible de demander au serveur de base de données de formater la date dans un certain format. Mais ceci reste en général assez lourd, et doit être pensé à chaque fois.

Nous avons donc des méthodes très pratiques et rapides dans `Zend_Date`, pour récupérer les dates depuis une base de données.

### Création d'une date depuis une base de données

Toutes les bases de données doivent répondre extrêmement rapidement à leurs requêtes. Pour stocker une date de manière optimale dans une base, il faut utiliser un timestamp. En interne, tous les SGBDs représentent les dates sous forme de timestamp (non Unix). Ainsi, leur demander un timestamp sera toujours plus performant que de leur demander une date dans un format précis.

    // SELECT UNIX_TIMESTAMP(my_datetime_column) FROM my_table
    $date = new Zend_Date($unixtimestamp, Zend_Date::TIMESTAMP);

### Création d'une date depuis une base de données dans un format

La sortie de chaque base de données est différente même si elles se ressemblent. Cependant elles ont toutes des formats compatibles `ISO`. La manière la plus simple de créer une date depuis une base de données est d'utiliser `Zend_Date::ISO_8601`. Les SGBDs connus pour être conformes pour `Zend_Date::ISO_8601` sont MySQL, MSSQL par exemple, mais ils sont tous capables de retourner une représentation `ISO8601` d'une donnée date. `ISO8601` possède l'avantage d'être lisible et compréhensible par un humain. Son inconvénient est qu'il est légèrement plus lourd à traiter qu'un simple timestamp UNIX. En revanche ceux-ci ne supportent pas les dates inférieures au 1er Janvier 1970.

    // SELECT datecolumn FROM my_table
    $date = new Zend_Date($datecolumn, Zend_Date::ISO_8601);

## Créer des dates depuis un tableau

Créer une date depuis un tableau est fréquent et pratique. Les clés du tableau sont :

- day : jour de la date, un nombre

- month : mois de la date, un nombre

- year : année complète de la date

- hour : heures de la date

- minute : minutes de la date

- second : secondes de la date

### Créer une date depuis un tableau

En temps normal on utilisera un tableau avec toutes ses clés. Si une clé est absente, la valeur qu'elle représente sera mise à la valeur zéro par défaut. Par exemple une tableau ne comportant pas la clé "`hour`", donnera naissance à une date ayant une partie heures à la valeur "0".

    $datearray = array('year' => 2006,
                       'month' => 4,
                       'day' => 18,
                       'hour' => 12,
                       'minute' => 3,
                       'second' => 10);
    $date = new Zend_Date($datearray);

    $datearray = array('year' => 2006, 'month' => 4, 'day' => 18);
    $date = new Zend_Date($datearray);