SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 204 visiteurs en ce moment

Accueil > Dates, calendriers et agendas > Filtre durée > Filtre durée

Filtre durée

9 janvier 2008 – par erational – 23 commentaires

13 votes

Un filtre pour calculer la période entre deux dates ou l’âge d’un élément

Utilisation du filtre

Ajouter le code du filtre dans votre fichier mes_fonctions.php

Zip - 1.3 ko
filtre durée
version 0.25

Vous pouvez ensuite utiliser le filtre selon la syntaxe

Il est possible d’ajouter un 2e paramètre pour préciser le formatage de durée

Différents formatages de durée proposés

Voici les différents formatages proposés

ValeurDéfinitionExemple
court on arrondit à la durée la plus proche (formatage par défaut) 4 semaines
etendu affichage complet en lettres 4 semaines 3 jours 23 heures 2 minutes
horaire affichage heures et minutes 2h04
minute affichage minutes cumulées 124
iso8601 affichage selon la norme iso 8601 P18Y9W4DT11H9M8S
ical même chose que iso8601 P18Y9W4DT11H9M8S

Pour faciliter l’internationalisation, il est aussi possible de sortir un élément inviduellement :

  • Y : année
  • W : semaine
  • D : jour
  • H : heure
  • M : minute
  • S : seconde

Exemple d’utilisation
On veut « un format à l’anglaise » qui affiche la durée de la façon suivante : 4’46’’

Références techniques

Exemple d’utilisation avec le plugin Agenda

Je programme un site de cinéma qui utilise le plugin Agenda pour saisir les séances. Pour chaque séance, le rédacteur saisit une date de début et fin

Voici ma boucle pour afficher toutes les séance d’un film avec l’heure de début de film et la durée

Explications
On utilise une boucle EVENEMENTS pour récupérer les séances liées à l’article grâce au critère {id_article} par ordre chronologique grâce au critère {par date_debut}

L’affichage des résultats se fait dans un tableau
Pour afficher la durée on utilise la filtre duree avec l’option d’affichage minute

Utiliser le filtre durée pour calculer l’âge d’un élément

Pour calculer l’âge d’un élément, il faut utiliser comme date de fin, la date actuelle.

Développement

Le code du filtre est disponible sur la zone à l’adresse http://zone.spip.org/trac/spip-zone...

Voir aussi

Le filtre date_relative peut aussi très pratique.

Dernière modification de cette page le 22 juillet 2010

Retour en haut de la page

Tout afficher

Vos commentaires

  • Le 16 août à 11:28, par dut En réponse à : Filtre durée

    suite à une discussion sur IRC, on m’a indiqué un code ’moderne’ qui permet d’utiliser une différence entre deux dates

    dans mes_fonctions.php

    1. /*
    2.  * Filtre pour donner le nombre de jour entre deux dates selon une méthode moderne
    3. */
    4. function diffdate($date_debut,$date_fin) {
    5. $interval = date_diff(date_create($date_debut), date_create($date_fin));
    6. return intval($interval->format('%R%a'));
    7. }

    Télécharger

    Dans le squelette (par exemple pour filtrer selon un écart de date)

    1. [(#DATE|diffdate{#AUTRE_DATE}|<={4}|oui)
    2. mon code conditionné
    3. ]

    Télécharger

    Répondre à ce message

  • Le 26 juin 2012 à 21:33, par mickstone En réponse à : Filtre durée

    est-ce que quelqu’un peut me donner la syntaxe pour BOUCLE ARTICLE pour ne pas afficher les artcicles dont la date de fin depasse la date du jour
    merci d’avance
    Mickstone

    Répondre à ce message

  • Le 18 juin 2012 à 17:21, par Cyril Marion En réponse à : Filtre durée

    Hello,

    Merci pour ce filtre qui m’a aidé à solutionner proprement une demande pour l’affichage d’une date de fin, si et seulement si la durée de l’évènement est supérieure à une journée !

    En utilisant l’affichage au format « D » (pour « jour ») et le filtre de comparaison |>{1} on obtient un code plus concis et efficace qu’avec des #EVAL et autres filtres |moins...

    Merci !

    • Le 21 juin 2012 à 14:36, par Cyril Marion En réponse à : Filtre durée

      Petit correctif :

      L’attribut ’D’ affiche le nombre de jours en partie restante, et non le cumul des jours, comme l’aurait fait un éventuel attribut ’jour’.

      Pour que la balise ci-dessus fonctionne, il faut afficher une valeur cumulée. La valeur cumulée disponible la plus proche est le nombre de minutes cumulées : ’minute’.

      Pour afficher la partie conditionnelle seulement si la date de fin se situe 1 jour après la date de début, la balise devient :

    Répondre à ce message

  • Le 2 juin 2012 à 11:22, par mickstone En réponse à : Filtre durée

    bonjour,
    cette fonction duree m’interesse, mais il me manque qq infos sur l’utilisation
    je suis en spip 212
    1) dans quel répertoire doit-on installer le pgm inc-duree.php ou dans quel fichier php peut-on l’inclure
    2) une fois la réponse à laquestion 1 OK, est-ce que 2 champs de saisie (date debut et date fin) apparaissent.
    merci d’avance pour l’éclairage
    Mickstone

    • Le 18 juin 2012 à 17:14, par Cyril Marion En réponse à : Filtre durée

      Bonjour,

      Si tu as déjà un fichier mes_fonctions.php dans ton dossier squelettes, tu peux simplement y copier/coller les lignes de la fonction « durée ».

      Si tu préfères ne pas mélanger tes fonctions existantes avec le filtre durée, tu peux placer le fichier inc_duree.php dans ton dossier squelettes, et charger ce filtre depuis ton fichier mes_fonctions.php avec la fonction inclure_spip de la manière suivante :

      Si tu n’as pas encore de fichier mes_fonctions.php dans ton dossier squelettes, copie-y le fichier inc_duree.php puis renomme-le mes_fonctions.php.

      Bonne utilisation !

    Répondre à ce message

  • Le 18 mars 2012 à 05:43, par Sylvano En réponse à : Filtre durée

    Bonjour,
    Petit problème avec le passage « Heure d’hiver/Heure d’été » (et oui nous sommes en mars !) (le problème inverse se produira en octobre). Constaté aujourd’hui sous wamp, je demande le nombre de jours : un calcul de durée sur un intervalle de 10 jours pleins incluant le 25 mars retourne 239 heures, donc 9 jours... logique.

    Résolu en définissant date_default_timezone_set("UTC"); au tout début de la fonction.

    Sylvano
    PS : La doc de PHP dit que lors d’un appel à date_default_timezone_get();, « date_default_timezone » prime sur l’option « date.timezone » du php.ini.
    Du coup, à tout hasard, je redéfinis date_default_timezone_set("Europe/Berlin"); à la fin du script. (est-ce vraiment nécessaire ? plus sûr ?)

    Répondre à ce message

  • Le 3 février 2011 à 15:01, par tarti En réponse à : Filtre durée

    Bonjour a tous,

    Si besoin voici ma fonction un peur modifier, elle permet notamment de calculer la différence entre deux date dans un format précis. Comme le nombre de jour entre deux dates.

    Exemple : avec $date_debut=16/11/2008, $date_fin=03/02/2011 $type_affichage=D vous obtiendrez 808, ou encore 2 avec $type_affichage=Y

    Attention, par rapport à la première version, Y devient Years, W devient Weeks, D devient Days, H devient Hours, M devient Minutes et S devient Secondes.

    Toutes les anciennes lettres servent à la nouvelle fonctionnalité.

    Voici la fonction :

    1. /*
    2.  * +----------------------------------+
    3.  * Nom du Filtre : duree
    4.  * +----------------------------------+
    5.  * date : 2008.01.10
    6.  * auteur : erational - http://www.erational.org et valentin PERRIN
    7.  * version: 0.25
    8.  * licence: GPL
    9.  * +-------------------------------------+
    10.  *
    11.  * retourne la duree entre 2 dates
    12.  *
    13.  * parametres type_affichage
    14.  * - court : 5 jours (par defaut)
    15.  * - etendu : 4 semaines 3 jours 23 heures 2 minutes
    16.  * - horaire : 4h39
    17.  * - minute : 124 (minutes cumulees)
    18.  * - iso8601 : P18Y9W4DT11H9M8S ref. http://fr.wikipedia.org/wiki/ISO_8601#Dur.C3.A9e
    19.  * - ical : P18Y9W4DT11H9M8S ref. http://tools.ietf.org/html/rfc2445#page-37 (mm chose que iso)
    20.  *
    21.  * pour sortir une valeur uniquement (i18n)
    22.  * - Years : (an)
    23.  * - Weeks : (semaine)
    24.  * - Days : (jour)
    25.  * - Hours : (heure)
    26.  * - Minutes : (minute)
    27.  * - Secondes : (s)
    28.  *
    29.  * pour sortir la différence dans un format précis.
    30.  * Exemple : avec $date_debut=16/11/2008, $date_fin=03/02/2011 $type_affichage=D vous obtiendrez 808, ou encore 2 avec $type_affichage=Y
    31.  * - Y : (an)
    32.  * - W : (semaine)
    33.  * - D : (jour)
    34.  * - H : (heure)
    35.  * - M : (minute)
    36.  * - S : (s)
    37.  *
    38. */
    39.  
    40. function duree($date_debut,$date_fin,$type_affichage='court') {
    41. $d_debut = mktime(
    42. substr($date_debut,11,2),
    43. substr($date_debut,14,2),
    44. substr($date_debut,17,2),
    45. substr($date_debut,5,2),
    46. substr($date_debut,8,2),
    47. substr($date_debut,0,4));
    48.  
    49. $d_fin = mktime(
    50. substr($date_fin,11,2),
    51. substr($date_fin,14,2),
    52. substr($date_fin,17,2),
    53. substr($date_fin,5,2),
    54. substr($date_fin,8,2),
    55. substr($date_fin,0,4));
    56.  
    57. $diff_seconds = $d_fin - $d_debut;
    58. if ($diff_seconds<0) return "";
    59. $diff_years = floor($diff_seconds/31536000);
    60. $diff_seconds -= $diff_years * 31536000;
    61. $diff_weeks = floor($diff_seconds/604800);
    62. $diff_seconds -= $diff_weeks * 604800;
    63. $diff_days = floor($diff_seconds/86400);
    64. $diff_seconds -= $diff_days * 86400;
    65. $diff_hours = floor($diff_seconds/3600);
    66. $diff_seconds -= $diff_hours * 3600;
    67. $diff_minutes = floor($diff_seconds/60);
    68. $diff_seconds -= $diff_minutes * 60;
    69. $str = "";
    70. switch ($type_affichage) {
    71. case "court" : if ($diff_years>1) $str = "$diff_years ans";
    72. else if ($diff_years>0) $str = "$diff_years an";
    73. else if ($diff_weeks>1) $str = "$diff_weeks semaines";
    74. else if ($diff_weeks>0) $str = "$diff_weeks semaine";
    75. else if ($diff_days>1) $str = "$diff_days jours";
    76. else if ($diff_days>0) $str = "$diff_days jour";
    77. else if ($diff_hours>1) $str = "$diff_hours heures";
    78. else if ($diff_hours>0) $str = "$diff_hours heure";
    79. else if ($diff_minutes>1) $str = "$diff_minutes minutes";
    80. else if ($diff_minutes>0) $str = "$diff_hours minute";
    81. break;
    82.  
    83. case "etendu" : if ($diff_years>1) $str .= "$diff_years ans ";
    84. else if ($diff_years>0) $str .= "$diff_years an ";
    85. if ($diff_weeks>1) $str .= "$diff_weeks semaines ";
    86. else if ($diff_weeks>0) $str .= "$diff_weeks semaine ";
    87. if ($diff_days>1) $str .= "$diff_days jours ";
    88. else if ($diff_days>0) $str .= "$diff_days jour ";
    89. if ($diff_hours>1) $str .= "$diff_hours heures ";
    90. else if ($diff_hours>0) $str .= "$diff_hours heure ";
    91. if ($diff_minutes>1) $str .= "$diff_minutes minutes ";
    92. else if ($diff_minutes>0) $str .= "$diff_hours minute ";
    93. if ($diff_seconds>1) $str .= "$diff_seconds secondes";
    94. else if ($diff_seconds>0) $str .= "$diff_seconds secondes";
    95. break;
    96.  
    97. case "horaire": $str = ($diff_hours+($diff_days*24)+($diff_weeks*24*7)+($diff_year*24*7*365))."h";
    98. if ($diff_minutes<10) $str .= "0";
    99. $str .= $diff_minutes;
    100. break;
    101.  
    102. case "minute": $str = $diff_minutes+($diff_hours*60)+($diff_days*60*24)+($diff_weeks*60*24*52)+($diff_year*60*24*365);
    103. break;
    104.  
    105. case "iso8601": $str = "P${diff_years}Y${diff_weeks}W${diff_days}DT${diff_hours}H${diff_minutes}M${diff_seconds}S";
    106. break;
    107.  
    108. case "ical": $str = "P${diff_years}Y${diff_weeks}W${diff_days}DT${diff_hours}H${diff_minutes}M${diff_seconds}S"; // mm chose que iso
    109. break;
    110.  
    111.  
    112. case "Years": $str = $diff_years;
    113. break;
    114. case "Weeks": $str = $diff_weeks;
    115. break;
    116. case "Days": $str = $diff_days;
    117. break;
    118. case "Hours": $str = $diff_hours;
    119. break;
    120. case "Minutes": $str = $diff_minutes;
    121. break;
    122. case "Secondes": $str = $diff_secondes;
    123. break;
    124. case "Y": $str = floor(($d_fin - $d_debut)/31536000);
    125. break;
    126. case "W": $str = floor(($d_fin - $d_debut)/604800);
    127. break;
    128. case "D": $str = floor(($d_fin - $d_debut)/86400);
    129. break;
    130. case "H": $str = floor(($d_fin - $d_debut)/3600);
    131. break;
    132. case "M": $str = floor(($d_fin - $d_debut)/60);
    133. break;
    134. case "S": $str = $d_fin - $d_debut;
    135. break;
    136.  
    137. default: break;
    138.  
    139. }
    140.  
    141. return $str;
    142. }

    Télécharger

    Répondre à ce message

  • Le 7 avril 2010 à 11:05, par Jeannot En réponse à : Filtre durée

    Bonjour,

    Le filtre minute me donne un résultat bizarre :

    [(#DEBUT|duree{#DATE,etendu})]
    Resultat : 13 semaines 5 jours 9 heures 49 minutes 58 secondes (ok)
    [(#DEBUT|duree{#DATE,horaire})]
    Résultat : 2313h49 (ok)
    [(#DEBUT|duree{#DATE,minute})]
    Résultat : 981229 (??)
    Si c’est du temps cumulé, il devrait être de 2313*60+49 soit : 138 829 ?
    Ou bien je ne n’ai pas bien compris.
    Merci pour votre explication

    Répondre à ce message

  • Le 17 juin 2009 à 19:28, par r-d En réponse à : En nombre de jours

    Il faut ajouter :

    case « jour » : $str = ($diff_days+($diff_weeks*7)+($diff_years*24*7*365)) ;
    break ;

    afin d’avoir le nombre de jours.

    Répondre à ce message

  • Le 10 janvier 2008 à 10:16, par Ced En réponse à : Filtre durée

    Pourrait on imaginer un filtre similaire pour calculer la durée entre la date de publication et la date de rédaction antérieure ? (dont l’unité de mesure serait le jour)

    Merci pour tout,

    cedric

    • Le 10 janvier 2008 à 12:52, par erational En réponse à : Filtre durée peut s’utiliser sur toutes les dates gérées par SPIP

      Le filtre durée est un filtre générique.

      Il peut s’appliquer à toutes les dates gérées par SPIP à savoir :

      • #DATE
      • #DATE_MODIF
      • #DATE_NOUVEAUTES
      • #DATE_REDAC

      Et à toutes balises ou plugins générant des dates au format yyyy-mm-dd hh:mm:ss comme par exemple le plugin agenda et ses balises #DATE_DEBUT et #DATE_FIN

      Pour un article, vous pouvez donc écrire :

      Si vous voulez uniquement afficher la durée en jours :

      ps. Si la date de fin est avant la date de début, le filtre durée ne retourne rien.

    • Le 13 février 2008 à 16:34, par kik En réponse à : Filtre durée peut s’utiliser sur toutes les dates gérées par SPIP

      Trés bonne idee le fitre duree. Cela m’a donné l’idee de l’adapter a mon club sportif.
      Je gere des joueurs et leurs dates de naissance sont entrées dans le champ « date de redaction anterieure ».
      Serait il possible d’adapter le fitre avec la date du jour courant #ENV afin de calculer l’age des joueurs et gerer facilement les licenses par exemple.

    • Le 14 février 2008 à 08:09, par erational En réponse à : Filtre durée pour calculer l’âge d’un élèment (article, rubrique, ...)

      bonne idée : le filtre durée permet de calculer l’âge.
      Il suffit d’utiliser en date de fin, la date actuelle

      Age d’un élèment
      [(#DATE|duree{#ENV{date}})]

      Pour les licences,
      cela ne conviendra peut-être pas car on calcule la durée en années entières écoulées (comme un anniversaire) et non en années civiles (nombre de 1er janvier écoulé). Cela entraine un décalage de plus ou moins un an.

    • Le 14 février 2008 à 08:45, par kik En réponse à : Filtre durée pour calculer l’âge d’un élèment (article, rubrique, ...)

      Merci pour ta reponse Rapide et c’est exact, car lorsque je fait :
      [(#DATE_REDAC|duree#ENVdate,etendu)] cela affiche :

      38 ans 7 semaines 4 jours 7 heures 38 minutes 56 secondes

      alors que la date redac est 17/03/1968 . cela devrait donné presque 40 ans. Bon d’accord c’est flateur ;-) mais c’est pas ce qui est voulu.
      de plus j’ai ce message là :

      Warning : mktime() : Windows does not support negative values for this function in c :\program files\easyphp1-8\www\spip\squelettes\mes_fonctions.php on line 39

    • Le 14 février 2008 à 09:03, par kik En réponse à : Filtre durée pour calculer l’âge d’un élèment (article, rubrique, ...)

      Je me repond à moi même car il y a eu erreur dans la syntaxe

      en fait les acolades ne se sont pas affichées dans le message autour de #ENV et date

    • Le 15 février 2008 à 09:03, par kik En réponse à : Filtre durée pour calculer l’âge d’un élèment (article, rubrique, ...)

      En cherchant un peu je me suis rendu compte que toute les dates de redac avant 1970 font ce message d’erreur cité precedement.

    • Le 15 février 2008 à 11:42, par erational En réponse à : Age avec date < 1970

      Il s’agit d’un erreur spécifique à windows et easyphp 1.8

      Si tu passes à easyphp 2.0 sur windows ou sur une plateforme Unix, mktime supporte les dates antérieures à 1970. Le filtre durée fonctionne bien et il capable de calculer des âges supérieurs à 38 ans (l’âge de l’âge Unix)

    • Le 15 février 2008 à 15:06, par kik En réponse à : Age avec date < 1970

      Merci de ce renseignement je vien de reinstaller la version 2 et cela fonctionne mieux
      Je n’ai plus le message d’erreur.

    Répondre à ce message

  • Le 12 janvier 2008 à 22:22, par ? En réponse à : Filtre durée

    J’ai testé aujourd’hui le filtre avec :

    [(#DATE|duree#DATE_DEBUT,D)]

    #DATE = 12/01/2008
    #DATE_DEBUT = 26/01/2008

    Il me retourne 6 au lieu de 14. C’est plutôt bizarre.

    • Le 30 janvier 2008 à 16:46, par Perline En réponse à : Filtre durée

      Tu n’as pas la bonne synthaxe ? :
      [(#DATE_DEBUT|duree{#DATE_FIN})]

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?
  • [Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Formidable, le générateur de formulaires

    23 janvier 2012 – 1968 commentaires

    Un générateur de formulaires facilement configurable pour les non-informaticiens et facilement extensible pour les développeurs. Introduction L’objectif était de créer un plugin permettant de générer des formulaires. Historiquement, 2 plugins (...)

  • Notation d’éléments SPIP

    25 juillet 2008 – 351 commentaires

    Ce plugin propose un système de notation des éléments de SPIP depuis l’espace public.

  • Formulaire de contact avancé

    23 mars 2009 – 1368 commentaires

    Un formulaire de contact configurable, avec de multiples options.

  • ORR v2

    21 mai 2013 – 89 commentaires

    ORR, le plugin d’Organisation des Réservations et des Ressources passe en version 2, avec quelques nouveautés attendues. Je ne reprendrai pas les explications données dans la version 1. Les nouveautés : 1. Gestion des autorisations Le (...)

  • Agenda 2.0

    3 novembre 2008 – 1020 commentaires

    Voici la version pour SPIP 2.0 du Plugin Agenda pour SPIP 1.9.2, avec une interface remaniée pour encore plus de plaisir. Pour une documentation concernant l’utilisation d’Agenda 3 pour SPIP 3, veuillez pour l’instant vous référer à SPIP 3, Agenda (...)