[php5] classe date/heure


Contenu du snippet

PHP5.2 étant sorti, je suis allé regarder la nouvelle classe de date/heure qui se trouve dans le core de PHP. Ma déception fut pour le moins assez grande pour m'appercevoir qu'on ne peut pratiquement rien faire de cette classe, car même en l'étendant on ne peut pas en faire vraiment grand chose.
J'ai décidé de me (re)faire ma propre classe et voici donc ce que cela donne :

- Une classe concrète qui va gérer la date et l'heure.
- Une classe concrète qui ne va gérer que la date.
- Une classe concrète qui ne va gérer que l'heure.

Voyons comment cela peut se coder :

Source / Exemple :


<?php
interface iDateTime {
 public function ToLocalFormat($format=null);
 public function ToFormat($format=null);	
}

/**

  • Classe gérant à la fois la date et l'heure
*
  • /
class oDateTime implements iDateTime { /**
  • Contient la date/heure en cours.
*
  • @var int
  • /
protected $value; /**
  • Garde en mémoire les différentes appels de méthodes ainsi que les résultats.
*
  • @var array
  • /
protected $cache = array('timestamp' => NULL, 'datetime' => array() ); public $defaultlocal; public $defaultdate; /**
  • Instanciation commune à toutes les classes filles.
  • Si aucun timestamp n'est passé en paramètre, la date/heure prise en compte
  • sera défini via time().
*
  • @param int[optional] $DateTime
  • /
public function __construct($DateTime=NULL) { $this->value = ( isset($DateTime) ) ? (int) $DateTime : time(); $this->cache['timestamp'] = $this->value; $this->defaultlocal = '%d %B %Y %H %M %S'; $this->defaultdate = 'd-m-Y h:i:s'; } /**
  • Retourne une chaine de l'objet en cours.
*
  • @return string
  • /
public function __ToString() { return (string) $this->value; } /**
  • Remet le cache à 0.
*
  • /
final protected function _FlushCache() { unset($this->cache); $this->cache = array('timestamp' => NULL, 'datetime' => array() ); } /**
  • Recharge le cache.
*
  • /
protected function ReloadCache() { $this->_FlushCache(); $this->cache['timestamp'] = $this->value; } /**
  • Modifie la date/heure.
  • La modification de la date/heure peut se faire avec les expressions de strtotime().
*
  • @param string $format
  • @param string $method 'plus' - 'minus'
  • @throws Exception
  • /
final public function Modify($format, $method) { if ( is_string($format) ) $format = strtotime($format); $method = strtolower($method); switch ( $method ) { case 'plus': $this->value += $format; break; case 'minus': $this->value -= $format; break; default: throw new Exception('...'); } $this->ReloadCache(); } /**
  • Créer un nouveau timestamp.
*
  • @param int $h
  • @param int $min
  • @param int $s
  • @param int $mon
  • @param int $d
  • @param int $y
  • /
public function Set($h, $min, $s, $mon, $d, $y) { $this->value = mktime((int) $h, (int) $min, (int) $s, (int) $mon, (int) $d, (int) $y); $this->ReloadCache(); } /**
  • Renvoit la date/heure à partir d'une chaine de formatage.
*
  • @param string[optional] $format strftime()
  • @return string
  • /
public function ToLocalFormat($format=null) { if ( is_null($format) ) $format = $this->defaultlocal; if ( !isset($this->cache['date'][$format]) ) { $this->cache['date'][$format] = strftime($format, $this->value); } return $this->cache['date'][$format]; } /**
  • Retourne la date/heure dans un format de type chaine.
*
  • @param string[optional] $format date()
  • @return string
  • /
public function ToFormat($format=null) { if ( is_null($format) ) $format = $this->defaultdate; if ( !isset($this->cache['date'][$format]) ) { $this->cache['date'][$format] = date($format, $this->value); } return $this->cache['date'][$format]; } } /**
  • Classe de date
  • Etend la classe aDateTime pour une meilleur gestion de la date.
*
  • /
class oDate extends aDateTime { /**
  • Initialise un nouveau timestamp type Date.
*
  • @param int $year
  • @param int $month
  • @param int $day
  • /
public function Set($year, $month, $day) { parent::Set(0, 0, 0, $month, $day, $year); } /**
  • Nouvelle instance de type date.
*
  • @param int $date
  • /
public function __construct($date=NULL) { parent::__construct($date); $this->defaultlocal = '%d %B %Y'; $this->defaultdate = 'd-m-Y'; } } /**
  • Classe d'heure
  • Etend la classe aDatetime pour une meilleur gestion de l'heure.
*
  • /
class oTime extends aDateTime { /**
  • Initialise un nouveau timestamp type Heure
*
  • @param int $hour
  • @param int $min
  • @param int $sec
  • /
public function Set($hour, $min, $sec) { parent::Set($hour, $min, $sec, 0, 0, 0); } public function __construct($time=null) { parent::__construct($time); $this->defaultlocal = '%H %M %S'; $this->defaultdate = 'h i s'; } } ?>

Conclusion :


Vous pouvez aussi faire des opérations avec les dates... bien que très sommaire pour le moment.
J'ai fais les grandes lignes, à vous de me dire ce qu'il manque :)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.