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] Calcules avec heures


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut [Dates] Calcules avec heures
    Bonjour,

    je développe en ce moment un jeu de type RPG au tour par tour. J'ai déjà pas mal avancé mais un gros problème perssiste. Je ne sais pas comment faire des calcules avec des heures (stokées en date et datetime dans ma BDD). Et c'est primordiale pour le calcule des période de jeu, DLA pour ceux qui connaissent.

    Je me demande donc si quelqu'un à une solution, ou une ruse.

    Merci d'avance.
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  2. #2
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Convertis tes dates en timestamp et après tu fais ce que tu veux avec !

    http://php.developpez.com/faq/?page=dates
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  3. #3
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Merci, j'ai trouvé mon bonheur.

    J'en profite pour signaler une erreur au paragraphe:

    Comment calculer le temps restants/écoulés entre deux heures ?

    Il manque un $ devant timestamp à la 3ème ligne du sous-paragraphe "Calcul du temps en h:min"

    Voilà


    Merci encore.
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  4. #4
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Bon nouveau problème, j'ai une date (YYYY-MM-DD HH:MM:SS) à laquelle je veut ajouter une heure (HH:MM:SS), sachant que cette heure peut modifier le jour de la date. J'ai essayé comme ça mais ça plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $timestamp1 = mktime ($h1, $m1, $sec1, $mois1, $jour1, $annee1);
    $timestamp2 = mktime ($h2, $m2, $sec2);
     
    $nouvelle_dla = ($timestamp1 + $timestamp2);
    Comment dois-je faire ? Merci d'avance.
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    http://fr2.php.net/manual/fr/function.mktime.php

    Les arguments peuvent être omis, de droite à gauche, et tous les arguments manquants sont utilisés avec la valeur courante de l'heure et du jour.
    Il y a également des timestamp ce qui, il me semble, rend la stratégie impossible.

    <?php
    $timestamp
    = mktime ($h1, $m1, $sec1, $mois1, $jour1, $annee1);
    $nouvelle_dla = $timestamp + $sec2 + ($m2 + $h2 * 60) * 60;
    ?>
    Venant de cette faiblesse, il me semble qu'il est bon d'écrire une interface pour abstraire la gestion des dates.

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Tu peux faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    	$date = '2006-07-21 23:15:25';
    	$timestampDate = strtotime($date);
    	$newDate = date('Y-m-d H:i:s', strtotime('+1 hour', $timestampDate));
     
    	echo "$date<br>$newDate";
    ?>

  7. #7
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Merci ça marche bien, mais j'ai deux questions (encore et toujours ...)

    Pour rajour 2 heures c'est "+2 hours" ou "+2 hour", et puis pour rajouter les minutes et les secondes c'est "+ x minute" et "+ x second" ??

    Enfin, comment vérifier qu'une date est plus recente qu'une autre, sachant qu'elles ne seront jamais plus anicienne que le 01/01/1970 ?

    Merci d'avance
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  8. #8
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Pour vérifier les dates avant 1970 je présume qu'il va falloir te farcir ça à la main.... ou alors directement dans les requêtes SQL si il y en a...
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  9. #9
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Non, justement aucune ne sera d'avant 1970 ! La plupart commence en 2003 !
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  10. #10
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Tiens ça devrait faire l'affaire

    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
    /********
       INF $d1 <= $d2 ?
    *********/
    /** 
    * Teste l'infériorité d'une date sur une autre
    * @param $d1 Date 1
    * @param $d2 Date 2
    * @return Bool True si Date 1 inférieure à Date 2, false sinon
    */
    public function inf($d1, $d2)
    {
        list($d,$m,$a) = explode('/',$d1);
    	$deb = mktime( 0, 0, 0, $m, $d, $a );
    	list($d,$m,$a) = explode('/',$d2);
    	$fin = mktime( 0, 0, 0, $m, $d, $a );
     
    	if ($deb<=$fin)
    		return true;
    	else return false;
    }	
     
    /********
       SUP $d1 > $d2 ?
    *********/
    /** 
    * Teste la supériorité d'une date sur une autre
    * @param $d1 Date 1
    * @param $d2 Date 2
    * @return Bool True si Date 1 supérieure à Date 2, false sinon
    */
    function sup($d1, $d2)
    {
        list($d,$m,$a) = explode('/',$d1);
    	$deb = mktime( 0, 0, 0, $m, $d, $a );
    	list($d,$m,$a) = explode('/',$d2);
    	$fin = mktime( 0, 0, 0, $m, $d, $a );
     
    	if ($deb>=$fin)
    		return true;
    	else return false;
    }
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  11. #11
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Merci beaucoup !
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  12. #12
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Sa fait deux heure que je capte pas, la boucle tourne en rond à cause de je ne sais quoi. pouvez-vous m'aidez, merci.


    le fichier index2.php:

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <?php
    session_start();
    require_once("include/config.php");
    include ('fonctions.php');
     
    $base = mysql_connect ($serveur, $username, $password); 
    	mysql_select_db ($nombase, $base);
     
    	//on demande à la base de donnée les informations de dla stokée
        $sql = 'SELECT dla_en_cour, duree_next_dla, dbt_next_dla FROM user WHERE login="'.addslashes($_SESSION['login']).'"';
        $data = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
     
    	//Si la date de prochaine DLA est plus ancienne que celle du serveur alors on calcule la nouvelle DLA	
    	$today = date('Y-m-d H:i:s');	
    	if(inf($data['dbt_next_dla'], $today) == true){
     
    		list($h,$m,$s) = explode(':',$data['duree_next_dla']);
     
    		$date = $data['dbt_next_dla'];
    		$timestampDate = strtotime($date);
    		$newDate = date('Y-m-d H:i:s', strtotime('+'.$h.' hour +'.$m.' minute +'.$s.' second', $timestampDate));
    				}
    				else {
    				echo 'Bienvenue, votre dla est toujours en cour';
    				exit;
    				}
    		//On verifie que la nouvelle date crée est bien plus recente que celle du serveur.
     
    			if(inf($newDate, $today) == true){
     
    			//Si ce n'est pas le cas on fait une boucle jusqu'à ce que ça soit bon
    				//----------[DEBUT BOUCLE]------------
    				while(inf($newDate, $today) == true)
    				{
    				$timestampDate = strtotime($newDate);
    				$newDate = date('Y-m-d H:i:s', strtotime('+'.$h.' hour +'.$m.' minute +'.$s.' second', $timestampDate));
    				}
    				//------------[FIN BOUCLE]------------ 
     
    				//On enregistre la nouvelle date limite d'action
    				$sql = 'UPDATE user SET dbt_next_dla='.$newDate.' WHERE login="'.addslashes($_SESSION['login']).'"'; 
    				mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
    				mysql_close();
     
    				//et on l'affiche
    				echo 'Votre prochaine date limite d\'action est:'.$newDate;
    				}
    			//Sinon on enregistre direct et on affiche la nouvelle DLA
    			else{
     
    				$sql = 'UPDATE user SET dbt_next_dla='.$newDate.' WHERE login="'.addslashes($_SESSION['login']).'"'; 
    				mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
    				mysql_close();
     
    				echo 'Votre prochaine date limite d\'action est:'.$newDate;
    			}		
     
    	mysql_close()
     
     
     
    ?>
    Le fichier de fonction:

    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
     
    /********
       INF $d1 <= $d2 ?
    *********/
    /** 
    * Teste l'infériorité d'une date sur une autre
    * @param $d1 Date 1
    * @param $d2 Date 2
    * @return Bool True si Date 1 inférieure à Date 2, false sinon
    */
    function inf($d1, $d2)
    {
    	list($dd1,$t1) = explode(' ',$d1);
    	list($a,$m,$d) = explode('-',$dd1);
    	list($h,$mi,$s) = explode(':',$t1);
    	$deb = mktime( $h, $mi, $s, $m, $d, $a );
    	list($dd2,$t2) = explode(' ',$d2);
    	list($a,$m,$d) = explode('-',$dd2);
    	list($h,$mi,$s) = explode(':',$t2);
    	$fin = mktime( $h, $mi, $s, $m, $d, $a );
     
    	if ($deb<=$fin)
    		return true;
    	else return false;
    }	
     
    /********
       SUP $d1 > $d2 ?
    *********/
    /** 
    * Teste la supériorité d'une date sur une autre
    * @param $d1 Date 1
    * @param $d2 Date 2
    * @return Bool True si Date 1 supérieure à Date 2, false sinon
    */
    function sup($d1, $d2)
    {
        list($dd1,$t1) = explode(' ',$d1);
    	list($a,$m,$d) = explode('-',$dd1);
    	list($h,$mi,$s) = explode(':',$t1);
    	$deb = mktime( $h, $mi, $s, $m, $d, $a );
    	list($dd2,$t2) = explode(' ',$d2);
    	list($a,$m,$d) = explode('-',$dd2);
    	list($h,$mi,$s) = explode(':',$t2);
    	$fin = mktime( $h, $mi, $s, $m, $d, $a );
     
    	if ($deb>=$fin)
    		return true;
    	else return false;
    }
    ?>
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  13. #13
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Sans l'erreur on aura du mal....
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  14. #14
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Alors l'erreur c'est ça ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [Mon Aug 21 19:14:42 2006] [error] [client 127.0.0.1] PHP Notice:  A non well formed numeric value encountered in C:\\www\\medievalheros\\beta2\\fonctions.php on line 43, referer: http://127.0.0.1/beta2/
    [Mon Aug 21 19:14:42 2006] [error] [client 127.0.0.1] PHP Notice:  Undefined offset:  2 in C:\\www\\medievalheros\\beta2\\fonctions.php on line 44, referer: http://127.0.0.1/beta2/
    [Mon Aug 21 19:14:42 2006] [error] [client 127.0.0.1] PHP Notice:  Undefined offset:  1 in C:\\www\\medievalheros\\beta2\\fonctions.php on line 44, referer: http://127.0.0.1/beta2/
    ... repeter de manière à me faire un fichier d'erreur de 100 mo que même !!
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  15. #15
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    T'as quoi ligne 43 comme code ?
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  16. #16
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    J'ai ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list($a,$m,$d) = explode('-',$dd1);
    La totalité du code est plus haut.
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

  17. #17
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    A mon avis tu as une date mal foutue ou carrément vide et ça te fait planter le tout

    Juste avant ta ligne 43 affiche la variable passée en paramètre et tu verras bien ce qui fait merder le tout
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  18. #18
    Membre habitué Avatar de Pahcixam
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 191
    Points
    191
    Par défaut
    Merci de ton aide,

    en effet c'était ma requête qui merdait. Du coup, il faisait des calcules à partir de 1970 en rajoutant 1 heure chaque fois jusqu'à aujourd'hui !
    Quelques conseils:

    Utilisez <?php plutôt que <?
    Utilisez des ' et la concaténation plutôt que "
    Pensez à revenir à la ligne après chaque ; pour plus de clarté.
    // Commentez votre code un maximum

Discussions similaires

  1. Colonne date oracle avec heure
    Par doc malkovich dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 18/05/2011, 13h05
  2. calcul avec heure
    Par froutloops62 dans le forum VBA Access
    Réponses: 3
    Dernier message: 19/08/2007, 03h41
  3. [Dates] Problème avec heure d'été
    Par crashou13 dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2007, 15h41
  4. [Dates] Calcul d'heure
    Par Kyvin dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2006, 08h13
  5. [MFC] Pb avec Heure et date système
    Par spirit_1999 dans le forum MFC
    Réponses: 5
    Dernier message: 07/06/2005, 16h31

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