1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| <?php
/**
* Cette classe est une extension de la classe php DateTime, afin de lui rajouter certaines fonctionnalité,
* notamment en terme de format d'affichage, et corriger des bug de php (ouin').
*/
class ODateTime extends DateTime {
/**
* Php n'est pas capable de générer correctement une date valant '0000-00-00 00:00:00'.
* Pour compenser, cette rustine à été mise en place. Quand une date non viable est passée au
* constructeur, estVide passe à true, __toString retourne la bonne valeur.
* @var boolean
*/
private $_estVide = false;
/**
* Constructeur de la classe.
* @param String $init : facultatif, à "now" par défaut pour avoir le dateTime courant. Peut prendre une
* date au format mysql (ex : 2004-03-20 01:06:00). Si une date invalide, vide ou commencant par 0000-00-00 est passée
* alors estVide est passé à true.
* Php bug sur la valeur 0000-00-00 donc il faut penser à tester estVide() avant de faire d'autres opérations
* qu'un simple affichage (__toString) sous peine d'avoir des résultats incohérents.
*/
public function ODateTime($init='now') {
$init = trim($init);
try {
if (strncmp($init, '0000-00-00', 10) == 0 || empty($init)) {
$this->_estVide = true;
DateTime::__construct('0000-00-00');
} else {
$this->_estVide = false;
DateTime::__construct($init);
}
} catch (Exception $e) {
$this->_estVide = true;
DateTime::__construct('0000-00-00');
}
}
/**
* Cette méthode est appelée quand DateTime est interprétée comme une chaine de caractères.
* Le format retourné est celui de mysql.
* @return String : la date au format mysql : 'Y-m-d H:i:s'
*/
public function __toString() {
if ($this->_estVide) {
return ('0000-00-00 00:00:00');
}
return ($this->format('Y-m-d H:i:s'));
}
/**
* A cause d'un bug stupide de php, les DateTime ne savent pas gérer la date 0000-00-00. De fait, la valeur
* vide passe par une variable interne "estVide". Avant de faire des opérations, si on a un doute sur la validité
* de la date, il faut d'abord tester si estVide ne retourne pas true.
* @return boolean : true si ce DateTime à été initialisé avec une valeur non valide, false sinon.
*/
public function estVide() {
return ($this->_estVide);
}
/**
* Cette méthode statique prend une date au format jj/mm/aaaa et la transforme au format aaaa-mm-jj qui est lisible
* directement par mysql.
* @param string $date : une date de la forme jj/mm/aaaa. Si ce format n'est pas respecté, la date retournée est
* 0000-00-00
* @return string : la date avec le nouveau format
*/
static public function reformateDateSql($date) {
@list($jour, $mois, $annee) = explode ('/', $date, 3);
if (empty($jour) || empty($mois) || empty($annee)) {
return ('0000-00-00');
} else {
return ($annee . '-' . $mois . '-' . $jour);
}
}
}
?> |
Partager