begin process at 2010 02 10 14:21:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] CLASSE DATE/HEURE

[PHP5] CLASSE DATE/HEURE


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :php, poo, date, time, abstraite Niveau :Initié Date de création :15/01/2007 Date de mise à jour :17/01/2007 14:50:15 Vu :9 795

Auteur : FhX

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

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

  • <?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';
  • }
  • }
  • ?>
<?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 :)


 Historique

17 janvier 2007 14:50:16 :
J'ai changé ma classe abstraite en une classe concrète qui sait tout faire. La spécialisation vient des classes filles (ce qui est un comportement normal en objet ^^) et n'apporte aucun surplus de poids à la classe mère.

 Sources du même auteur

PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.
PHP 5 - CLASSE MYSQL (STYLE MYSQLI)
PHP5 - GESTION DE MODULES EN OBJET
PHP5 - CLASSE DE NEWS ET DE COMMENTAIRES
PHP5 - CLASSE DE GESTION DE MODULES

 Sources de la même categorie

Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan
Source avec Zip POO - FACTORY CLASS par Waredan
POO - SINGLETON CLASS par Waredan
POO - PARAMETERHOLDER CLASS par Waredan

 Sources en rapport avec celle ci

Source avec Zip CLASSE DATETIME ÉTENDUE PHP 5.2 par nautilus99
UNIX TIME CONVERTER (UTC) par tiger222
Source avec Zip [PHP5]CLASSE DE TEMPLATE PHP AVEC CACHE par hametsu21
Source avec Zip TENTATIVE D'APPROCHE D'UN MODÈLE CRUD : UTILISATION D'UNE CL... par codefalse
Source avec Zip [POO] CLASSE D'ABSTRACTION SQL par neigedhiver

Commentaires et avis

Commentaire de iow4 le 15/01/2007 22:27:09

Comment ça rien faire ?

Commentaire de malalam le 16/01/2007 12:41:46 administrateur CS

Hello,

petites erreurs : tu as confondu l'index datetime et l'index date, dans ta propriété cache.
Et il faut que tu modifies la méthode ToLocalFormat () comme ça par exemple :
public function ToLocalFormat($format = null) {
if (is_null ($format)) {
switch (get_class ($this)) {
case 'oDate':
$format = '%d %B %Y';
break;
case 'oTime':
$format ='%H %M %S';
break;
default:
throw new Exception ('...');
}
}
if ( !isset($this->cache['date'][$format]) ) {
$this->cache['date'][$format] = strftime($format, $this->value);
}
return $this->cache['date'][$format];
}

Sinon ça ne fonctionne pas.

A part ça c'est sympa, très simple, et ça mériterait d'être approfondi à mon avis!

Commentaire de FhX le 16/01/2007 13:40:19

Oh oui exact :)

En réalité, il faut que je la mette en abstraite et que je la définisse correctement dans mes classes filles.

Vais m'en occuper dans la journée (chui tombé malade...)

Commentaire de FhX le 16/01/2007 13:45:50

>> iow4

En examinant la classe DateTime de PHP, tu remarqueras qu'elle est encore incomplète.
En effet, tu ne peux passer qu'un string pour une date, de la forme jjmmyyyy que tu peux ensuite parser via DateTime::format($format) qui va en faite éxécuter la fonction date() de php.

De plus, aucune propriété n'est défini dans cette classe et je me demande donc bien comment on peut faire pour pouvoir l'exploiter correctement. Car même en supposant que tu veuilles l'hériter, tu ne peux rien récupérer.

Voila pourquoi j'avais fait cette classe.

Commentaire de malalam le 16/01/2007 14:07:20 administrateur CS

Ouais de même, peut-être "génériser" les appels de Set () pour la définir en tant que méthode abstraite dans aDateTime ?

Commentaire de guill76 le 16/01/2007 20:09:01

Salut,
Et pour ta methode __toString pourquoi mettre un echo dedans puisque de toute façon cette methode est implicitement appelée et uniquement avec echo ou print
d'ailleurs si tu fais print($objDate) ça risque d'être bizarre, enfin je crois.
J'aurais plutot fait un return. Mais bien quand même.

Commentaire de FhX le 16/01/2007 20:32:05

parce que je me suis planté :p

Commentaire de FhX le 17/01/2007 14:50:50

Et vouala :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

php, sql et time() [ par armoun78 ] voila mon probleme : pour écrire la date et l'heure actuelle dans ma base de données, je recupere l'heure et la date actuelle en php par l'intermédia recuperer l'url de la page a partir d'une autre page [ par db2p ] hellovoila j'ai une page php: index.phpen bas de cette page je mets un include genreinclude 'date_modif.php';le fichier 'date_modif.php' doit afficher date & heure php [ par eax ] salutjuste une petite question je voudrais faire une addition de 20 minutes sur un timestamp Y-m-d H:i:s comment faire?merci sylvain PHP et MySQL : format de date [ par vir76 ] Salut tout le monde,Voilà, dans MySQL, j'ai converti mon format DATE à l'aide de la fonction SELECT DATE_FORMAT(nom de mon champ, mon format)Le serveu PHP et MySQL : format de date [ par vir76 ] Bonjour,Je voudrais convertir le format de date de mySQL (aaaa-mm-jj) en format français (jj-mm-aa). J'ai essayé plusieurs fonctions présentes sur ce date time [ par rigaudstar ] Bonjour à tous, Alors voila j'ai programmé tant bien que mal des pages en php qui cherche leur info dans une base access. L'une de ces info est l'affi Fonction php date [ par Niníel ] Hello, est-ce qu'une fonction permet, à partir d'un numéro de semaine, de retrouver les dates correspondantes? je sais que l'on peut faire l'inverse, Date probleme [ par g0belin ] Ben voila en fait je veux faire un agenda...je veux afficher seulement les entree dans la base pour le jour courant...MAIS sa marche PASsa m'affiche t Date du lendemain en PHP [ par kimengumi ] Salut à tous,Je viens d'être confronté à un chtit problème, c'est d'afficher la date du lendemain en PHPVous allez me dire qu'il suffit de faire un da Zapper la date ? [ par phpwankenobi ] Bonjour,J'utilise la date courante dans des scripts PHP, afin de simuler des situations futures je souhaiterais changer celle-ci à une valeur de monch


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,014 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales