IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Dates] Validité d'une date


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de arti2004
    Inscrit en
    Février 2004
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 253
    Par défaut [Dates] Validité d'une date
    SLT

    j'ai une date donnée a laquelle je rajoute un certain nombre de jours.

    comme est montré ds l'exemple ci dessous :
    $next='28-02-2007';
    $next=$next + (2*24*60*60);
    $next= date('d-m-Y', $next);


    ma question est comment tomber ds une date valide ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Par défaut
    Pour faire cela mieux vaut passer par la fonction mktime() qui permet de construire un timestamp a partir des paramètres d'une date.

    Tu peux ainsi rajouter à volonté jours, mois, années, etc.

    L'autre solution est de transformer ta date en timestamp pour ensuite faire l'addition que tu proposes, mais c'est se compliquer la vie pour pas grande chose

    Dans ton code tu ne fais qu'ajouter un entier à une chaine de caractère, ce qui peut donner n'importe quoi

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    Bonjour,

    J'ai longtemps chercher une solution améliorée pour manipuler les dates mais finalement, je n'ai rien trouvé de terrible, même dans la libraire Zend_Date.

    J'ai donc créé ces 3 fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /* Renvoie la date mise en forme dans un autre format
     * la date peut être au format standard (aaaa-mm-jj) ou au format français (jj/mm/aaaa)
     * l'heure peut aussi être précisée sous la forme : hh:mn
     * jj/mm/aaaa => aaaa-mm-jj
     * aaaa-mm-jj => jj-mm-aaaa
     * si la date ne correspond à aucun de ces formats, elle est renvoyée telle quelle
     * si timestamp = true, le timestamp est renvoyé.
     */
    function formatDate($pdate, $timestamp = null)
    {
    	if (IsNullDate($pdate))
    		return null;
    	else {
    		// Extraction des informations
    		ereg("[0-9]{2,4}[-/][0-9]{2}[-/][0-9]{2,4}", $pdate, $date);
    		if (ereg("[0-9]{2}(:)[0-9]{2}", $pdate, $time)) {
    			list($heure, $minute) = explode(':', $time[0]);
    			$strTime = ' '.$time[0];
    		} else {
    			$heure = $minute = 0;
    			$strTime = '';
    		}
    		if (ereg("(/)", $date[0])) {
    			list($jour, $mois, $annee) = explode('/', $date[0]);
    		} else {
    			list($annee, $mois, $jour) = explode('-', $date[0]);
    		}
    		if ($timestamp == true) {
    			return mktime($heure, $minute, 0, $mois, $jour, $annee);
    		} else {
    			if (ereg("(/)", $date[0]))
    				return $annee.'-'.$mois.'-'.$jour.$strTime;
    			else
    				return $jour.'/'.$mois.'/'.$annee.$strTime;
    		}
    	}
    }
     
    /* Renvoie une date décalée de n jours, n mois, n années. n pouvant être positif ou négatif.
     * date entrée-sortie => timestamp
     */
    function decalageDate($pDate, $pJour = 0, $pMois = 0, $pAnnee = 0)
    {
    	list($jour, $mois, $annee, $heure, $minute) = explode('/', date('d/m/Y/H/i', $pDate));
    	return(mktime($heure, $minute, 0, $mois + $pMois, $jour + $pJour, $annee + $pAnnee));
    }
     
    function IsNullDate($date)
    {
    	return ($date == '0000-00-00' || $date == '' || $date == null);
    }
    Elles permettent de jongler aisément entre le format français dd/mm/yyyy et anglais yyyy-mm-dd, de transformer une date en timestamp, de gérer les heures et de faire des additions-soustractions de jours/mois/années

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $next='28-02-2007';
    $next=decalageDate(formatDate($next, true), 2);
    echo date('d-m-Y', $next);
    Affiche : 02-03-2007

    Ces fonctions correspondent exactement à mes besoins, mais il est possible de les modifier selon tes besoins.

    Pour ma part, après avoir galéré à gérer les dates-heures format anglais ou français (selon que je suis dans un champ de formulaire ou stockage en base), j'ai fini par manipuler et stocker des timestamps.

    Certains diront "tu fais bcp de conversions, surtout pour ajouter un nombre de jours ou autre" :
    Oui, au début j'utilisais un code simple comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $next=$next + (2*24*60*60);
    Mais ce code a ses limites : les changements d'heure. Si ça tombe à ce moment là, on n'aura pas +2 jours mais 1 jour et 23 heures.

    Pour info, j'ai utilisé mes fonctions dans une application de gestion de planning et pointage. Elle marchent donc parfaitement et répondent à la plupart des exigences.
    J'aurais pu écrire plusieurs petites fonctions plutôt qu'un pavé comme formatDate. C'est surtout que je connais pas toujours le type d'entrée d'une date, cette fonction s'occupe de tout : déterminer le format d'entrée et agir en conséquence.

Discussions similaires

  1. [SQL] Ajouter une durée à une date et obtenir une date valide
    Par bigltnt dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/06/2007, 14h55
  2. [Débutant] Calcul d'une date à partir d'une date de départ et d'une durée
    Par Marmotton76 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/04/2007, 10h39
  3. Réponses: 2
    Dernier message: 21/03/2007, 16h06
  4. Réponses: 14
    Dernier message: 09/01/2007, 16h19
  5. [Dates] date() validité d'une date
    Par BigBarbare dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2006, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo