[php5] classe date/heure

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 599 fois - Téléchargée 21 fois


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

Ajouter un commentaire

Commentaires

FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3 -
Et vouala :)
FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3 -
parce que je me suis planté :p
guill76
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016
-
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.
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
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 ?
FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3 -
>> 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.

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.