Depuis la version 5.1 une nouvelle classe a fait son apparition : DateTime. Cette classe expérimentale dans les versions 5.1 est depuis officiellement incluse depuis les versions 5.2 de PHP. La liste des fonctions disponibles est ici. Il suffit de regarder toutes les fonctions commençant par "date_".

Quelques exemples d'utilisations :

<?php
// crée un nouvel objet DateTime
$d = new DateTime('2008-12-26 23:59:59');
echo $d->format('c');
 
// crée un nouvel objet DateTime à partir d'un timestamp UNIX
$ts = time();
$d = new DateTime('@' . $ts);
echo $d->format('c');
 
try {
    // le constructeur lance une exception si la chaîne de date n'est pas valide
    $d = new DateTime("2008-12-32");
} catch (Exception $e) {
    echo "date non valide";
}
 
// l'appel à date_create ne lance pas d'exception
$d = date_create("2008-12-32");
if ($d === FALSE) {
    echo "date non valide";
} else {
    // date valide
}

J'ai effectué quelques comparaisons avec les fonctions classiques strtotime et date afin de voir si DateTime est ou non plus lente. J'ai donc écrit un script pour tester les temps de réponses d'un appel à la fonction date avec un appel à strtotime ou avec un timestamp puis la même chose en utilisant DateTime. Afin d'avoir des valeurs plus cohérentes, j'ai fait la moyenne sur 1000 itérations à chaque fois. Voici le script utilisé :

$nb_iters = 1000;
$values = array();
echo "with strtotime: ";
for ($i = 0; $i < $nb_iters; $i++) {
    $s = microtime();
    $ts = strtotime('2008-12-25');
    $str = date('c', $ts);
    $e = microtime();
    $values[] = $e - $s;
}
printf("%.06f s\n", array_sum($values) / $nb_iters);
 
$values = array();
echo "without strtotime: ";
for ($i = 0; $i < $nb_iters; $i++) {
    $s = microtime();
    $str = date('c', $ts);
    $e = microtime();
    $values[] = $e - $s;
}
printf("%.06f s\n", array_sum($values) / $nb_iters);
 
$values = array();
echo "with datetime: ";
for ($i = 0; $i < $nb_iters; $i++) {
    $s = microtime();
    $d = new DateTime('2008-12-26');
    $str = $d->format('c');
    $e = microtime();
    $values[] = $e - $s;
}
printf("%.06f s\n", array_sum($values) / $nb_iters);
 
$values = array();
echo "with datetime given a timestamp: ";
for ($i = 0; $i < $nb_iters; $i++) {
    $s = microtime();
    $d = new DateTime("@$ts");
    $str = $d->format('c');
    $e = microtime();
    $values[] = $e - $s;
}
printf("%.06f s\n", array_sum($values) / $nb_iters);

Le résultat obtenu :

with strtotime: 0.000028 s
without strtotime: 0.000012 s
with datetime: 0.000024 s
with datetime given a timestamp: 0.000054 s

Comme on peut le voir, DateTime se révèle plus rapide qu'un appel conjoint de date et de strtotime. En revanche, si l'on possède déjà un timestamp, mieux vaut utiliser directement la fonction date puisqu'elle est deux fois plus rapide. DateTime se révèle donc très intéressant pour gérer des dates au format chaînes. En revanche, et c'est lié au design de DateTime, l'utilisation de cette classe avec un timestamp doit être évitée tant que possible. En effet la classe ne gère pas en natif le passage d'un timestamp à la construction et parse donc la chaîne donnée ce qui donne des temps de construction très lent (le double d'un appel avec une chaîne classique).