[PHP] Tester un écart entre 2 dates

Une moulinette de code qui s'est enrayée, une requête SQL qui ne passe pas ?
ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

[PHP] Tester un écart entre 2 dates

Messagede ph.gras » 28 Juin 2014, 09:56

C'est avec un grand intérêt que j'ai lu cet article :
http://www.finalclap.com/faq/110-php-ca ... -deux-date

Parce que je cherche à tester si le dernier article publié sur mon site l'a été depuis
plus de X jours, Y heures et Z secondes.

Le nombre de jours, heures et secondes étant laissé à l'appréciation du moment. Il
faut donc que je code un formulaire pour enregistrer l'écart selon le moment.

Disons que lundi, je souhaite tester si l'écart est > à 3 jours, 2 heures et 1 minute,
mais quelques jours plus tard, je me ravise et choisis un autre écart de test.

Ce serait plus simple avec un système décimal (23,258 jours), mais je n'ai pas très
envie comme utilisateur d'effectuer la conversion que j'aurais programmée en tant
que développeur pour faire le calcul inverse… Je me demande encore quelle serait
la meilleure méthode pour aborder facilement ce problème d'arithmétique, dans le
cadre d'un petit script.

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2188
Inscription: 06 Sep 2008, 22:05

Re: [PHP] Tester un écart entre 2 dates

Messagede Galdon » 28 Juin 2014, 11:35

Je crois que le plus simple est d'utiliser strtotime avec les formats de date relatif (cf. http://www.php.net/manual/en/datetime.f ... lative.php) :

Code: Tout sélectionner
<?php
$now = 1403950285;
echo 'now                       : '.date('Y-m-d H:i:s', $now)."\n";
echo '-1 day                    : '.date('Y-m-d H:i:s', strtotime('-1 day', $now))."\n";
echo '-1 day -3 hour            : '.date('Y-m-d H:i:s', strtotime('-1 day -3 hour', $now))."\n";
echo '-1 day -3 hour -10 second : '.date('Y-m-d H:i:s', strtotime('-1 day -3 hour -10 second', $now))."\n";
?>

Ce qui donne :
Code: Tout sélectionner
now                       : 2014-06-28 12:11:25
-1 day                    : 2014-06-27 12:11:25
-1 day -3 hour            : 2014-06-27 09:11:25
-1 day -3 hour -10 second : 2014-06-27 09:11:15


Et pour l'appliquer à ton cas concret, qui consiste à tester l'âge d'un article :
Code: Tout sélectionner
<?php
$now = 1403950285;
$article_exemple['timestamp_de_publication'] = $now - 3600*24*3 - 3600*2; // article publié il y a 3 jours et 2 heures
$age_article = $now - $article_exemple['timestamp_de_publication']; // age de l'article, en secondes
$date_limite = strtotime('-3 day -2 hour -10 second', $now);
$age_limite  = $now - $date_limite;

if ($age_article > $age_limite) {
   echo "L'article est plus ancien que l'âge limite";
} else {
   echo "L'article est plus récent que l'âge limite";
}
?>
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: [PHP] Tester un écart entre 2 dates

Messagede ph.gras » 28 Juin 2014, 12:46

Ça peut être en effet pratique d'enregistrer le délai dans la base de données
sous la forme d'une chaîne de caractères numériques avec 3 champs pour le
jour, l'heure et les minutes dans un formulaire à saisir.

Si $date + $delai = $now, on passe à l'opération suivante… Ça va ?

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2188
Inscription: 06 Sep 2008, 22:05

Re: [PHP] Tester un écart entre 2 dates

Messagede Galdon » 28 Juin 2014, 14:58

Je ne sais pas, ça dépend ce que tu veux faire. Il faudrait détailler ce que tu souhaite faire pour que je puisse te donner une réponse précise.
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: [PHP] Tester un écart entre 2 dates

Messagede ph.gras » 28 Juin 2014, 19:48

Peut-être que justement, je ne sais pas très bien non plus. Je ne demandais d'ailleurs
pas de réponse précise, mais j'étais plutôt à la recherche d'une méthode de travail.

Ça m'a quand même bien aidé, ce que tu m'as donné sur la manipulation des dates en
PHP. Je n'ai jamais fait ça, moi. C'est la toute, toute première fois ! Alors je me sens un
peu impressionné par le truc.

Bon, je définis doucement mes méthodes :geek: et je reviendrai les présenter ici plus tard.

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: [PHP] Tester un écart entre 2 dates

Messagede ph.gras » 01 Juil 2014, 19:02

Bon, ben ça y est :D . C'est encore assez crado, mais ça fonctionne :
Code: Tout sélectionner
<?php
/*
Plugin Name: Stick Old Post
Plugin URI:
Description: Get your old posts sticky for 1 day or more to promote them.
Author: Philippe Gras
Version: 1.0
Author URI: http://********************
*/
class PostSticker {
   var $delay = '25 hours 13 minutes';
   var $sloop = '24 hours 7 minutes';
   function PostSticker() {
      add_action('admin_menu', array( &$this, 'stk_init' ) );
      add_action('init', array( &$this, 'stk_first_post' ) );
   }

   function stk_init() {
      add_options_page( 'Stick Old Post Options', 'Stick Old Post', 'edit_users', 'sticker', array( $this, 'stk_admin' ) );
   }

   /********************************
    * Retourne le temps UNIX du jour
    */
   function stk_day_date() {
      return strtotime('now');
   }

   /********************************
    * Retourne le temps UNIX du délai
    * prévu pour initialiser le truc,
    * la première fois :
    */
   function stk_interval() {
      return strtotime("+$this->delay");
   }

   /********************************
    * Retourne l'intervalle de temps
    * en date, mais ne sert pas dans
    * la réalité pour le programme :
    */
   function stk_time_to_stick() {
      $date = date_add(date_create(get_lastpostdate()),date_interval_create_from_date_string("$this->delay"));
      return date_format($date,"Y-m-d H:i:s");
   }

   /********************************
    * Retourne le temps UNIX pour le
    * dernier billet publié :
    */
   function stk_last_post() {
      return strtotime( get_lastpostdate() );
   }

   /********************************
    * Retourne le moment où doit se
    * produire la première action :
    */
   function stk_get_delay() {
      return $this->stk_day_date() - $this->stk_last_post();
   }

   function stk_delayed() {
      if ( $this->stk_get_delay() > $this->delay ) return true;
   }

   /********************************
    * Retourne un ID au hasard dans
    * le stock de global $post :
    */
   function stk_random_ID() {
      $posts = get_posts('orderby=rand&numberposts=1');
      foreach ( $posts as $post ) {
         return $post->ID;
      }
   }

   /********************************
    * Retourne un billet à la une au
    * hasard quand le délai arrive à
    * terme (sticky posts) :
    */
   function stk_first_post() {
      $stickies = get_option('sticky_posts');
      if ( empty($stickies) && $this->stk_delayed() == true ) {
         $to_stick = stick_post($this->stk_random_ID());
            return $to_stick;
      }
   }

   function stk_unstick() {
      if ( !empty($stickies) && $this->stk_delayed() == false ) {
         $unsticked = unstick_post($this->stk_first_post());
            return $unsticked;
      }
   }

   function stk_admin() {

      ?>
         <h2>Stick Old Post Options :</h2>
            <p>Date du serveur:
      <?php
               echo $this->stk_day_date() . ' == ' . date_format( date_create($now), 'Y-m-d H:i:s');
      ?>
         </p>
            <p>Date du dernier billet:
      <?php
               echo $this->stk_last_post() . ' == ' .  get_lastpostdate();
      ?>
         </p>
            <p>Durée entre les dates:
      <?php
               echo $this->stk_get_delay();
      ?>
         </p>
            <p>Pour afficher un post au hasard:
      <?php
            $stickies = get_option('sticky_posts');
            print_r( $stickies );
      ?>
         </p>
      <?php
   }
}

$sticker = new PostSticker;
?>

J'en suis à l'ébauche pour le moment. Il faut encore que je programme une tâche cron
pour continuer la boucle, là elle est seulement initialisée. Après, il faudrait ajouter un
formulaire pour choisir ses intervalles de temps, et éventuellement exclure des billets.

Comme tu vois, j'ai utilisé le temps UNIX, plus pratique pour les soustractions. C'est un
bon système ;) que tu m'as proposé.

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: [PHP] Tester un écart entre 2 dates

Messagede ph.gras » 16 Juil 2014, 11:47

Ça avance :D … Quelle est la fonction la plus rapide, à votre avis ?
Code: Tout sélectionner
<?php
      $get_date = date('Y-m-d H:i:s', $this->stk_time_load());
      $date_form = date_create($get_date);
      if (function_exists('date_add') /* PHP Version > 5.2 */ ) {
         $date_next = date_add($date_form,date_interval_create_from_date_string("$this->delay"));
         return date_format($date_next,'Y-m-d H:i:s');
      } else {
         $date_next = strtotime("+$this->delay");
         return date( 'Y-m-d H:i:s', $date_next );
      }
?>

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2188
Inscription: 06 Sep 2008, 22:05

Re: [PHP] Tester un écart entre 2 dates

Messagede Galdon » 16 Juil 2014, 22:08

C'est à dire ? quel est le code le plus rapide entre le if et le else ?
Si c'est ça, je ne sais pas, il faudrait faire des benchmark pour le savoir. Mais à mon avis ça ne vaut pas le coup de se prendre la tête ici, la différence entre les deux va se compter en micro secondes, même pas en millisecondes, donc à part si tu prévois d’appeler ce code dans une boucle avec des milliers d'itérations, il ne faut pas chercher à optimiser le code pour les performances, il faut plutôt sélectionner le code le plus simple à comprendre et à maintenir (donc le else).
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol

mediumvoyant
Addict
Addict
 
Messages: 75
Inscription: 04 Avr 2018, 07:51

Re: [PHP] Tester un écart entre 2 dates

Messagede mediumvoyant » 04 Avr 2018, 09:00

vous êtes artistes , footballeurs , comédiens,
et vous cherchez a être très célèbres , attirés et aimés par le publics ,
plus de soucis à vos désires , vous ressentez des sentiments forts pour quelqu’un
alors que ce dernier ne ressent rien en retour pour vous ou ne vous aime
plus vous avez vécu des moments fascinants et forts avec votre compagne qui du jour au lendemain vous
annonce qu’il ne vous aimes plus vous avez vécu des années de vie de couple avec votre conjoint
qui commence a ne plus s’intéresser a vous, a prendre ses distances, a ne
plus vous aimer vous vous demandez ce qui ne va pas, vous êtes perdu et
déprimez et vous ne savez pas quoi faire
c’est simple contactez un professionnel en service occulte: médium: après un bref résumé de ce qui vous arrive il
procédera a une consultation gratuite et vous fera le diagnostic de la situation et vous proposeras en même temps
la solution a votre problème il pourra faire selon le cas un rituel de retour affectif: un envoûtement d’amour
par la magie blanche c’est un rituel sans inconvénient ,ni retombé , basé sur l’ordre naturel des choses pour attirer
les sentiments de votre conjoint,les diriger vers vous et vous seul et par la même occasion



CONTACT MAITRE Dahvodoun Gosso

Téléphone personnel/whatsap: +229 60 00 53 91

E-mail personnel: maitre.gosso@hotmail.com

Site web https://mediumvoyantmagic.wixsite.com/m ... r-affectif

site web http://maraboutvoyantmagic-retouraffectif.cmonsite.fr/


Retourner vers PHP/MySQL

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

cron