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 ?
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 ?
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![]()
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:
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
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); }
Par exemple:
Affiche : 02-03-2007
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);
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:
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $next=$next + (2*24*60*60);
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.
Partager