[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


Retourner vers PHP/MySQL

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité