[Php] Fonction qui retourne une date X jours avant la date courante

Fonction qui retourne une date X jours avant la date courante [Php] - PHP - Programmation

Marsh Posté le 20-02-2003 à 15:50:00    

Bonjour les gens,
 
voilà j'ai eu besoin d'obtenir une date D, X jours avant la date courante.
J'ai été surpris de voir qu'il n'y avait pas de fonction déjà toute faite à ce sujet, donc je me suis codé la mienne.
 
Je me suis dit que ça pourrait peut être servir un jour à quelqu'un, donc voici le code :
 

Code :
  1. <?
  2.       /*-------------------------------------------------------------------*/
  3.       /*----- Fonction qui calcule une date antérieure au jour actuel -----*/
  4. /*---------- en fonction du nombre de jours qui les sépare ----------*/
  5.       /*-------------------------------------------------------------------*/
  6. function calcul_date($indice){
  7.  if($indice < 29){
  8.  //Uniquement parce que pas le temps de gérer le cas où on doit reculer de plusieurs mois
  9.   $annee = date("Y" );
  10.   $mois = date("m" );
  11.   $jour_courant = date("d" );
  12.   if(($jour_courant-$indice) > 0){
  13.    /* On reste dans le mois en cours */
  14.    /*--------------------------------*/
  15.    $jour_courant = $jour_courant-$indice;
  16.    $date = $jour_courant." / ".$mois." / ".$annee;
  17.    return $date;
  18.   }else{
  19.    /* On doit "reculer" d'un mois */
  20.    /*-----------------------------*/
  21.    if(($mois-1) > 0){
  22.     /* On ne change pas d'année */
  23.     /*--------------------------*/
  24.     $mois--;
  25.     switch($mois){
  26.      case 1:
  27.       /* On est en janvier */
  28.       /*-------------------*/
  29.       $jour_courant = 31-($indice-$jour_courant);
  30.       $date = $jour_courant." / ".$mois." / ".$annee;
  31.       return $date;
  32.      case 2:
  33.       /* On est en février */
  34.       /*-------------------*/
  35.       if(($annee % 4) == 0){
  36.        //année bissextile
  37.        $jour_courant = 29-($indice-$jour_courant);
  38.       }else{
  39.        //année normale
  40.        $jour_courant = 28-($indice-$jour_courant);
  41.       }
  42.       $date = $jour_courant." / ".$mois." / ".$annee;
  43.       return $date;
  44.      case 3:
  45.       /* On est en mars */
  46.       /*----------------*/
  47.       $jour_courant = 31-($indice-$jour_courant);
  48.       $date = $jour_courant." / ".$mois." / ".$annee;
  49.       return $date;
  50.      case 4:
  51.       /* On est en avril */
  52.       /*-----------------*/
  53.       $jour_courant = 30-($indice-$jour_courant);
  54.       $date = $jour_courant." / ".$mois." / ".$annee;
  55.       return $date;
  56.      case 5:
  57.       /* On est en mai */
  58.       /*---------------*/
  59.       $jour_courant = 31-($indice-$jour_courant);
  60.       $date = $jour_courant." / ".$mois." / ".$annee;
  61.       return $date;
  62.      case 6:
  63.       /* On est en juin */
  64.       /*----------------*/
  65.       $jour_courant = 30-($indice-$jour_courant);
  66.       $date = $jour_courant." / ".$mois." / ".$annee;
  67.       return $date;
  68.      case 7:
  69.       /* On est en juillet */
  70.       /*-------------------*/
  71.       $jour_courant = 31-($indice-$jour_courant);
  72.       $date = $jour_courant." / ".$mois." / ".$annee;
  73.       return $date;
  74.      case 8:
  75.       /* On est en août */
  76.       /*----------------*/
  77.       $jour_courant = 31-($indice-$jour_courant);
  78.       $date = $jour_courant." / ".$mois." / ".$annee;
  79.       return $date;
  80.      case 9:
  81.       /* On est en septembre */
  82.       /*---------------------*/
  83.       $jour_courant = 30-($indice-$jour_courant);
  84.       $date = $jour_courant." / ".$mois." / ".$annee;
  85.       return $date;
  86.      case 10:
  87.       /* On est en octobre */
  88.       /*-------------------*/
  89.       $jour_courant = 31-($indice-$jour_courant);
  90.       $date = $jour_courant." / ".$mois." / ".$annee;
  91.       return $date;
  92.      case 11:
  93.       /* On est en novembre */
  94.       /*--------------------*/
  95.       $jour_courant = 30-($indice-$jour_courant);
  96.       $date = $jour_courant." / ".$mois." / ".$annee;
  97.       return $date;
  98.     }
  99.    }else{
  100.     /* On recule d'un an */
  101.     /*-------------------*/
  102.     $annee--;
  103.     $mois=12;
  104.     $jour_courant=31-($indice-$jour_courant);
  105.     $date = $jour_courant." / ".$mois." / ".$annee;
  106.     return $date;
  107.    }
  108.   }
  109.     }else{
  110.  return -1;
  111.     }
  112. }
  113.       /*-------------------------------------------------------------------*/
  114.       /*-------------------------------------------------------------------*/
  115.       /*-------------------------------------------------------------------*/
  116. ?>


 
Comme vous le voyez, j'ai simplifier la chose en me limitant dans le nombre de jours d'écarts possible, parce qu'après c'est plus subtile au niveau des changements de mois et tout ça.
 
Si j'avais vous avez des avis pour améliorer, vous êtes les bienvenus.
 
:hello:


---------------
[ Canon EOS 30D ] (Grip + Canon 50mm f/1.4 + Canon 18-55mm USM + Tamron 70-300mm Di LD Macro)  [Galerie perso]
Reply

Marsh Posté le 20-02-2003 à 15:50:00   

Reply

Marsh Posté le 20-02-2003 à 15:51:35    

meme semble bien quil y a une fontion ...  :heink:
 
edit :  
premierement ... avant que je trouve mieux.
- T = prendre le time stamp courant
- T = T - NBJOUR*24*60*60 (24 heures en secondes)
- date = date(format, T)
 
exemple -30 jours :  

Code :
  1. $T = time();
  2. echo date("Y - m - d",$T)."<br>";
  3. $T = $T - (30*24*3600);   
  4. echo date("Y - m - d",$T)."<br>";


 


2003 - 02 - 20
2003 - 01 - 21


 
c correct ou pas ?


Message édité par beleg le 20-02-2003 à 15:57:18
Reply

Marsh Posté le 20-02-2003 à 15:55:25    

beleg a écrit :

meme semble bien quil y a une fontion ...  :heink:  


 
Non, mais c'est plus simple de faire
 
$dateAvant = time () - (X*24*60*60);


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 20-02-2003 à 16:00:07    

on va se prendre un pot pr notre optimisation de folie ...
 
non sans rire .. on avait fait un truc ici, mais pr le retrouver ... on avait donner une date .. enfin je regarde pdt 2 minutes, si je trouve tant mieux, sinon, tant pis.

Reply

Marsh Posté le 20-02-2003 à 16:01:41    

:cry:  J'me suis fait chier pour rien  :pt1cable:  
 
Chui vraiment con des fois  :pfff:


---------------
[ Canon EOS 30D ] (Grip + Canon 50mm f/1.4 + Canon 18-55mm USM + Tamron 70-300mm Di LD Macro)  [Galerie perso]
Reply

Marsh Posté le 20-02-2003 à 16:04:19    

jai :
 
$T = mktime ( 0,0,0,02,20-30,2003);
 
heure,minute,secondes,mois,jour - X,annee ...
 
et il renvoie un timestamp correct ...

Reply

Marsh Posté le 20-02-2003 à 16:04:39    

Pas du tout.  :non:  
 
Tu as du réfléchir à ce problème particulier, et tu l'as résolu à ta manière. Ce faisant, tu as fais des progrès. ;)

Reply

Marsh Posté le 20-02-2003 à 16:15:34    

Hermes le Messager a écrit :

Pas du tout.  :non:  
 
Tu as du réfléchir à ce problème particulier, et tu l'as résolu à ta manière. Ce faisant, tu as fais des progrès. ;)
 


 
:jap: certes tu as raison
En tout cas merci les gars !!
:hello:


---------------
[ Canon EOS 30D ] (Grip + Canon 50mm f/1.4 + Canon 18-55mm USM + Tamron 70-300mm Di LD Macro)  [Galerie perso]
Reply

Marsh Posté le 21-02-2003 à 21:32:17    

N'empêche ça doit fouttre la haine  :lol:


---------------
Belgian connection
Reply

Marsh Posté le 21-02-2003 à 21:48:34    

Belgique a écrit :

N'empêche ça doit fouttre la haine  :lol:  


 
bof, ça arrive...


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 21-02-2003 à 21:48:34   

Reply

Marsh Posté le 21-02-2003 à 22:00:21    

Ahhh parlons de date...J'ai un prb tout con, de base.
 
J'ai une date stocké dans un TIMESTAMP de MySQL et j'aimerais le convertir en 21-02-2003 suivi de 21:42..
 
Enfin un truc classique quoi (j'imagine)...Sauf que là je suis un train de me prendre là tête comme un boeuf entre UNIX_TIMESTAMP, date et google qui n'a pas de solution directe!
 
Ah, je précise, PHP et SQL, c'est pas mon domaine!
 
Edit: au passage, j'ai bien une solution avec
$dd=substr($myrow[1], 6,2);
$mm=substr($myrow[1],4,2);
$yy=substr($myrow[1],2,2);
$fulldate=$dd."-".$mm."-".$yy;
 
Mais bon, y a rien de direct avec date() et companie?


Message édité par Willyzekid le 21-02-2003 à 22:03:35

---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 21-02-2003 à 22:31:58    

Willyzekid a écrit :

J'ai une date stocké dans un TIMESTAMP de MySQL et j'aimerais le convertir en 21-02-2003 suivi de 21:42..
 
Enfin un truc classique quoi (j'imagine)...Sauf que là je suis un train de me prendre là tête comme un boeuf entre UNIX_TIMESTAMP, date et google qui n'a pas de solution directe!
 
[...]
 
y a rien de direct avec date() et companie?


Si si, date() fait ca très bien :)
 

date("d-m-Y H:i", $row['ta_date_depuis_mysql_en_timestamp'])


Message édité par Core 666 le 21-02-2003 à 22:32:26
Reply

Marsh Posté le 21-02-2003 à 22:57:28    

Core 666 a écrit :


Si si, date() fait ca très bien :)
 

date("d-m-Y H:i", $row['ta_date_depuis_mysql_en_timestamp'])




 
Non non parce qu'en fait le Timestamp de MySQL n'est pas du même type que le Timestamp qu'attendant PHP...D'où problème et résultat incohérent.
J'ai trouvé cette solution:
 


//Time conversion
$result=mysql_query('SELECT UNIX_TIMESTAMP($myrow[1]) as epoch_time FROM NewsTab');
$unix_timestamp = mysql_result ($result, 0, 0);
date("d-m-Y", $unix_timestamp)


 
Mais putain 3 lignes pour cette connerie?? :ouch:
 
D'où la question: que vaut-il mieux faire?
- Dans la base, stocker la date dans un format lisible directement (plus rapide, etc.)
- Avoir ces 3 lignes à chaque fois?


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 21-02-2003 à 23:13:52    

Non ben d'ailleurs, c'est encore plus simple que ça...Ca ne marche pas !!!
Ahhrrrrgg, j'aime MySQL, j'aime PHP...


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 22-02-2003 à 10:40:24    

si tetais sympa, tu aurais mis un lien direct vers le timestamp mysql.
 
Cela dit, je stocke soit sous la forme yyyymmddhhmmss soit timestamp php.
 
http://www.mysql.com/doc/en/DATETIME.html
Column type   Display format  
TIMESTAMP(14) YYYYMMDDHHMMSS  
TIMESTAMP(12) YYMMDDHHMMSS  
TIMESTAMP(10) YYMMDDHHMM  
TIMESTAMP(8)  YYYYMMDD  
TIMESTAMP(6)  YYMMDD  
TIMESTAMP(4)  YYMM  
TIMESTAMP(2)  YY  
 
 

UNIX_TIMESTAMP(date)

If called with no argument, returns a Unix timestamp (seconds since '1970-01-01 00:00:00' GMT) as an unsigned integer. If UNIX_TIMESTAMP() is called with a date argument, it returns the value of the argument as seconds since '1970-01-01 00:00:00' GMT. date may be a DATE string, a DATETIME string, a TIMESTAMP, or a number in the format YYMMDD or YYYYMMDD in local time.
 
mais vu que tu stockes au format YYYYMMDDHHMMSS  ou approchant
 

Code :
  1. $ret = substr($date, 6, 2)."-";
  2. $ret .= substr($date, 4, 2);
  3. $ret .=  "-".substr($date, 0, 4); 
  4. return $ret;


Message édité par beleg le 22-02-2003 à 10:57:54
Reply

Marsh Posté le 22-02-2003 à 20:03:48    

Heu en fait, j'ai fait une DATE_FORMAT() autrement plus simple mais que j'arrivais pas à mettre en place!
Cela dit, merci beaucoup...j'étais un gros état de dépression hier :)


---------------
Horizon pas Net, reste à la buvette!!
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed