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] Boucle pour creer des dates [Sources]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Avatar de Konrad Florczak
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 242
    Points : 336
    Points
    336
    Par défaut [Dates] Boucle pour creer des dates
    Bonjour,

    j'aimerais savoir si quelqu'un connait un moyen simple de generer avec un boucle des dates. Du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $date1=2006-03-10;
    $date2=2006-08-11;
    $i=0;
     
    for ($i=$date1, $i=$date, $i++)
    {
    echo"$i\n";
    }
    et que l'output soit
    2006-03-10
    2006-03-11
    2006-03-12
    [...]
    2006-08-11
    Merci beaucoup
    Avant de poster consultez la recherche avancée du forum
    N'oubliez pas le bouton

    Formation LaTeX et Outils Pratiques

    C'est ce que nous pensons déjà connaître qui nous empêche souvent d'apprendre.

  2. #2
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    quelque chose dans ce gout là :

    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
     
    <?php
    $date1 = '20-10-1980';
    $date2 = '18-02-1981';
     
    $expl_date1 = explode('-', $date1);
     
    $timestamp = mktime(0, 0, 0, $expl_date1[1], $expl_date1[0], $expl_date1[2]);
     
    $date_tmp = $date1;
     
    while ($date_tmp != $date2) {
       $timestamp = $timestamp + (3600*24);
       $date_tmp = date("d-m-Y", $timestamp);
       echo $date_tmp.'<br>';
    }
     
    ?>
    à la louche et sans tester, mais l'idée est là
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  3. #3
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    ReBonjour

    Si la boucle doit être faite en php, alors le meilleur moyen est de transformer les dates en timestamp via mktime().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $date1='2006-03-10';
    $date2='2006-08-11';
     
    $tabDate = explode('-',$date1);
    $tsDate1 = mktime(0,0,0,$tabDate[1],$tabDate[2],$tabDate[0]);
    $tabDate = explode('-',$date2);
    $tsDate2 = mktime(0,0,0,$tabDate[1],$tabDate[2],$tabDate[0]);
    unset($tabDate);
    Ensuite il suffit de faire une boucle for en ajoutant 86400s ( 24h*60m*60s ) à chaque passage pour changer de jour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for($i=0;$i<$tsDate2-$tsDate1;$i+86400){
    echo date('d-m-Y',$tsDate1+$i);
    }
    Ça c'est le moyen rapide mais qui n'est pas simple pour la compréhension, une autre méthode consisterait à relancer la fonction mktime() à chaque passage de la boucle mais il faut connaitre le nombre de jours entre date1 et date2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for($i=0;$i<date('d',$tsDate2-$tsDate1);$i){
    echo date('d-m-Y',mktime(0,0,0,date('m',$tsDate1),date('d',$tsDate1)+$i,date('Y',$tsDate1));
    }
    Ma préférence va pour la méthode avec ajout des secondes, car je pense que c'est beaucoup plus rapide
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  4. #4
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par FCYPBA
    ReBonjour
    ...
    haha, on vouddrait le faire exprès, on ne ferait pas mieux
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  5. #5
    Membre averti
    Avatar de Konrad Florczak
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 242
    Points : 336
    Points
    336
    Par défaut
    Oauis merci beaucoup les gars, je fais chauffer le forum PHP aujourdhui
    Mais c'est pour la bonne cause

    Merci en tout cas !
    Avant de poster consultez la recherche avancée du forum
    N'oubliez pas le bouton

    Formation LaTeX et Outils Pratiques

    C'est ce que nous pensons déjà connaître qui nous empêche souvent d'apprendre.

  6. #6
    Membre averti
    Avatar de Konrad Florczak
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 242
    Points : 336
    Points
    336
    Par défaut
    Bien j'ai testé les deux codes et le output est toujours le meme :

    pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $tabDate = explode('-',$date);
    $tsDate = mktime(0,0,0,$tabDate[1],$tabDate[2],$tabDate[0]);
    $tabDate = explode('-',$date2);
    $tsDate2 = mktime(0,0,0,$tabDate[1],$tabDate[2],$tabDate[0]);
    unset($tabDate);
     
    for($i=0;$i<$tsDate2-$tsDate;$i+86400){
    echo date('d-m-Y',$tsDate+$i);
    }

    2006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-102006-03-10 2006-03-10
    .....


    et pareil pour l'autre boucle.
    Avant de poster consultez la recherche avancée du forum
    N'oubliez pas le bouton

    Formation LaTeX et Outils Pratiques

    C'est ce que nous pensons déjà connaître qui nous empêche souvent d'apprendre.

  7. #7
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Bonjour,

    Je viens de voir qu'il y avait une petite erreur dans mon script

    Au niveau de la boucle for, j'ai bétement remplacé un $i++ par $i+86400. Il faut bien entendu lire $i+=86400, sinon la valeur de $i n'est jamais incrémenté et l'on se trouve en présence d'une belle boucle infini

    Algo corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $tabDate = explode('-',$date);
    $tsDate = mktime(0,0,0,$tabDate[1],$tabDate[2],$tabDate[0]);
    $tabDate = explode('-',$date2);
    $tsDate2 = mktime(0,0,0,$tabDate[1],$tabDate[2],$tabDate[0]);
    unset($tabDate);
     
    for($i=0;$i<$tsDate2-$tsDate;$i+=86400){
    echo date('d-m-Y',$tsDate+$i);
    }
    Désolé pour ce petit contre-temps

    Bonne continuation
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  8. #8
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    je viens de tester mon code, et il marche....
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  9. #9
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    voici la version qui affiche selon ton format :

    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
     
    <?php
    	$date1 = '1980-10-20';
    	$date2 = '1981-02-18';
     
    	$expl_date1 = explode('-', $date1);
     
    	$timestamp = mktime(0, 0, 0, $expl_date1[1], $expl_date1[2], $expl_date1[0]);
     
    	$date_tmp = $date1;
     
    	while ($date_tmp != $date2) {
    	   $timestamp = $timestamp + (3600*24);
    	   $date_tmp = date("Y-m-d", $timestamp);
    	   echo $date_tmp.'<br>';
    	}
    ?>
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  10. #10
    Membre averti
    Avatar de Konrad Florczak
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 242
    Points : 336
    Points
    336
    Par défaut
    Moi aussi il marche nickel

    Merci beaucoup mon bon monsieur !
    Avant de poster consultez la recherche avancée du forum
    N'oubliez pas le bouton

    Formation LaTeX et Outils Pratiques

    C'est ce que nous pensons déjà connaître qui nous empêche souvent d'apprendre.

  11. #11
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Salut

    Un autre alternative sans vouloir interférer dans la réponse de Titoumimi

    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
    <?php
     
    $date1= strtotime("2006-03-10"); 
    $date2= strtotime("2006-08-11"); 
     
    $njrs=($date2-$date1)/60/60/24;
     
    for($i=0;$i<=$njrs;$i++) 
    { 
    $date = date('Y-m-d',$date1);
     
    print("$date<br>");
    $date1+=60*60*24; 
    }
     
    ?>
    Ce n'est pas parce que les choses sont difficiles qu'on n'ose pas les entreprendre.
    C'est parce qu'on n'ose pas les entreprendre qu'elles sont difficiles.

  12. #12
    Membre averti
    Avatar de Konrad Florczak
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 242
    Points : 336
    Points
    336
    Par défaut
    J'ai testé ta version Alain, et elle marche très bien également.

    Merci encore pour votre temps
    Avant de poster consultez la recherche avancée du forum
    N'oubliez pas le bouton

    Formation LaTeX et Outils Pratiques

    C'est ce que nous pensons déjà connaître qui nous empêche souvent d'apprendre.

  13. #13
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par alain31tl
    Salut

    Un autre alternative sans vouloir interférer dans la réponse de Titoumimi

    ...
    il n'y a aucun problèles, plus il y a de solutions, mieux c'est, et tout le monde apprend de celles des autres
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Attention peut-être avec le timestamp. Ne risque-t-on pas des problèmes avec le passage à l'heure d'été / d'hiver ? Bon je sais, je pinaille

  15. #15
    Membre averti
    Avatar de Konrad Florczak
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 242
    Points : 336
    Points
    336
    Par défaut
    En effet, si on sait utiliser la fonction rechercher
    Avant de poster consultez la recherche avancée du forum
    N'oubliez pas le bouton

    Formation LaTeX et Outils Pratiques

    C'est ce que nous pensons déjà connaître qui nous empêche souvent d'apprendre.

  16. #16
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par Konrad Florczak
    En effet, si on sait utiliser la fonction rechercher

  17. #17
    Membre averti
    Avatar de Konrad Florczak
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 242
    Points : 336
    Points
    336
    Par défaut
    non je repondais à Titoumimi :

    il n'y a aucun problèles, plus il y a de solutions, mieux c'est, et tout le monde apprend de celles des autres
    Avant de poster consultez la recherche avancée du forum
    N'oubliez pas le bouton

    Formation LaTeX et Outils Pratiques

    C'est ce que nous pensons déjà connaître qui nous empêche souvent d'apprendre.

  18. #18
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    OK, pas de problèmes

  19. #19
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par vg33
    Attention peut-être avec le timestamp. Ne risque-t-on pas des problèmes avec le passage à l'heure d'été / d'hiver ? Bon je sais, je pinaille
    non, aucun soucis avec le timestamp, les journées font toujours 24h, et on ne joue pas avec les heures : on la définit à minuit pour créer le timestamp, ça ne posera aucun soucis
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  20. #20
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Citation Envoyé par vg33
    Attention peut-être avec le timestamp. Ne risque-t-on pas des problèmes avec le passage à l'heure d'été / d'hiver ? Bon je sais, je pinaille
    Dans le cas cité, on fixe un format date et non pas un format date + heure. Donc.......
    Ce n'est pas parce que les choses sont difficiles qu'on n'ose pas les entreprendre.
    C'est parce qu'on n'ose pas les entreprendre qu'elles sont difficiles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle pour parcourir des dates
    Par DjiLow dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2012, 14h56
  2. Probleme Pour Comparer Des Dates
    Par Domingo60 dans le forum VBScript
    Réponses: 7
    Dernier message: 25/04/2007, 09h33
  3. [MySQL] le format idéal pour stocker des dates avec l'heure
    Par Philoulheinz dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/02/2007, 21h53
  4. Pb pour agréger des dates
    Par Dunsany dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 29/01/2007, 18h59

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