[spip-dev] Filtre date_relativebuggé sur spip 2.1.2

Peut être faudrait il tester dans date_relative
si c'est une date relative à partir de aujourd'hui ou d'un autre jour ?
JLuc

-------- Message original --------
Sujet: Filtre date_relativebuggé sur spip 2.1.2
Pour : spip@rezo.net
Groupes de discussion: gmane.comp.web.spip.user

Bonjour,

Le filtre date_relative retourne un resultat incorrect sur les dates à venir sur
spip 2.1.2 :

[(#VAL{'2010-10-16 19:00'}|date_relative{0,'2010-10-14 22:14'})]

l'exemple ci-dessus retourne "demain" au lieu de "dans 1 jour".
L'utilisation des arguments dans le filtre est faite uniquement pour pouvoir
  tester soi-meme le probleme.

Le résultat est le même en appliquant le filtre sans argument sur une balise de
son choix.

Frank

Il faut surtout compléter le test
http://zone.spip.org/trac/spip-zone/browser/core/tests/filtres/date_relative.php

pour décrire ce qui es attendu.
Cédric

Il faut surtout compléter le test
Connexion · GitLab
pour décrire ce qui es attendu.

Hummm...
quote spip.net : "Le filtre |date_relative appliqué à toute balise #DATE...
affichera une information liée à la balise selon la date du contexte."

Il semble que "la date du contexte", ce n'est pas seulement "l'instant présent",
mais celui de la boucle contenant si il y en a une.

Pourtant actuellement, |date_relative ne renvoie que :
  "il y a 2 minutes",
  'hier',
  "demain",
  "dans 2 jours",
  "il y a 2 jours" ...
c'est à dire comme si le "contexte" était toujours "l'instant présent".

Si le contexte c'est une date passée ou future, ces formulations ne sont pas adaptées.
Il conviendrait mieux :
  "2 minutes après",
  "la veille",
  "le jour suivant" (ou "le lendemain")
  "2 jours après"
  "2 jours avant" ...

A moins que quelquechose ne m'échappe, il faudrait donc soit restreindre les specs,
soit modifier le jeu de test, mais aussi et surtout le code,
et ajouter des chaines de langues...

En fait pour que date_relative adapte au contexte la formulation de sa réponse,
il faudrait tester si la date de référence c'est "maintenant" ou non,
et, en fonction, renvoyer la réponse selon l'un ou l'autre jeu de formulation.

Enfin bon...
JLuc

je pense avoir trouvé d'ou vient le problème.

Dans le code du filtre, on teste le délai séparant les 2 dates, à savoir la date
système et la date traitée par le filtre.

il me semble que pour pouvoir afficher "demain" ou "hier", il faut que le délai
séparant ces 2 dates soit inférieur à 1 jour,
hors actuellement le test se base sur un delai inferieur à 2 jours pour afficher
demain ou hier

donc

  else if ($decal > 3600 * 24) {
    $jours = floor ($decal / (3600 * 24));
    if ($jours < 2)
      return $il_y_a=="date_dans"?
_T("date_demain"):_T("date_hier");
    else
      $delai = "$jours "._T("date_jours");
  }

devient

  else if ($decal > 3600 * 24) {
    $jours = floor ($decal / (3600 * 24));
    if ($jours < 1)
      return $il_y_a=="date_dans"?
_T("date_demain"):_T("date_hier");
    else
      $delai = "$jours "._T("date_jours");
  }

et la le resultat est correct

Frank

Si la référence est un article daté du 27 octobre 2008 (ou 2012),
la date relative du 26 octobre peut elle être "hier" ?
Il me semble que non : pour dire "hier", il faut être "aujourd'hui".
Quand la référence n'est pas "aujourd'hui", on ne dit pas "hier", mais "la veille".
On ne dit pas "demain" mais "le jour suivant", ou "le lendemain".
On ne dit pas "il y a 3 jours" mais "3 jours avant".
On ne dit pas "dans 3 jours" mais "3 jours après".

Exemple :
on ne dit pas
"Mr de Lapalisse est mort vendredi 13 janvier 1666 à 13h13.
il y a 2 heures, il vivait encore. Hier même, il vivait encore".

mais on dit :
"Mr de Lapalisse est mort vendredi 13 janvier 1666 à 13h13.
2 heures avant, il vivait encore. La veille même, il vivait encore".

JLuc

par rapport a ton propos, JLuc, c'est tout a fait exact ce que tu dis,

en fait je parle du contexte ou on ne transmet pas de date référence au filtre,
et ou donc la date relative à déterminer se base sur la date du jour, soit
aujourd'hui / maintenant.

La on obtient bien un résultat incorrect dans l'état actuel des choses,
quand le délai avec maintenant est égal ou supérieur a 1 jour et inférieur a 2
jours.

en fait dans mon post, j'ai fait resurgir non intentionnellement
un 2eme problème, que tu as su saisir au vol, et qui apparaît
lorsqu'on transmet une date référence au filtre.

il ne s'agit plus en effet de faire apparaître "demain" ou "hier"
mais "la veille" ou "le lendemain" selon le cas

Il faut surtout compléter le test
Connexion · GitLab
pour décrire ce qui es attendu.

Hummm...
quote spip.net : "Le filtre |date_relative appliqué à toute balise #DATE...
affichera une information liée à la balise selon la date du contexte."

Il semble que "la date du contexte", ce n'est pas seulement "l'instant présent",
mais celui de la boucle contenant si il y en a une.

Non, non. Le 3ème argument présent dans le filtre est proposé uniquement afin de pouvoir tester la fonction de manière reproductible
http://core.spip.org/trac/spip/changeset/15497
Sans cet argument, la date de référence étant un time() généré dans la fonction, il devenait impossible de vérifier que le filtre produisait bien le résultat attendu en fonction de la date passée et de 'maintenant' puisque le 'maintenant' n'était pas connu avec précision a priori.

L'utilisation dans les squelettes se fait toujours sans ce 3ème argument, et c'est donc toujours la date de l'instant présent qui compte.
Il n'est pas du tout prévu d'implémenter un support de cette date de référence pour changer le format de la réponse.

Pour en revenir à la question initiale posée :

...
Le filtre date_relative retourne un resultat incorrect sur les dates à venir sur
spip 2.1.2 :

[(#VAL{'2010-10-16 19:00'}|date_relative{0,'2010-10-14 22:14'})]

je disais donc qu'il fallait compléter le jeu de test avec ces cas aux limites et le résultat attendu, mais en restant bien dans le cadre de ce que doit faire ce filtre tel que documenté !

Cédric

Ah bon.

JL

17/10/10, JLuc:

> Il n'est pas du tout prévu d'implémenter un support de
> cette date de référence pour changer le format de la réponse.

Ah bon.

Ceci dit, si quelqu'un fournit un patch qui apporte la fonctionnalité
que tu demandes (sans apporter de régression), je suis sûr qu'il sera
accepté.

Belle ouverture !

si j'ai bien compris Cédric, la version actuelle prend seulement la date actuelle comme référence,
et donc pour pas de régression des sites historiques, il faudra un paramètre supplémentaire
pour indiquer, lorsque ce sera le cas, qu'on veut que la date de référence soit
"la date de l'objet courant" dans la boucle courante.

Mais pour ma part, je ne saurais pas raisonnablement récupérer la date de l'objet courant dans la boucle courante, ni dans le filtre, ni à la compilation... Quelqu'un saurait il ?
JLuc