Erreur jeedom lors de l'usage de résultat d'une commande dans time_diff

Dans la suite de ma question sur time_diff
cc @jpty

J’ai essayé de faire ceci
time_diff(#[atHome][TARS16][Vu Dernière Fois]#,Now,s)

et cela provoque l’erreur suivante
DateTime::__construct(): Failed to parse time string (#1664#) at position 0 (#): Unexpected character

la fonction time_diff ne sait pas évaluer le résultat d’une commande ?
dans mon cas #[atHome][TARS16][Vu Dernière Fois]# a pour valeur 2020-01-19 17:19:24
qui est le format correct
time_diff(2020-01-19 17:19:24,Now,s) donnant 974682

peut être manque-t-il le traitement de la commande comme dans valueDate

Salut,

Et sans le « e » accent grave è c’est pareil ?
time_diff(#[atHome][TARS16][Vu Derniere Fois]#,Now,s)

As-tu testé ta formule dans le Testeur d’expressions ?

Oui c’est le résultat du testeur d’expression,
il dit que c’est le # de #[atHom… qui lui pose un problème

( Dernière ou Derniere donne la même erreur)

Bonjour @jm98 ,

La fonction actuelle time_diff n’accepte que des dates pas de numéro de commande (#1664# ça donne soif :wink:).

Dans la fonction time_between définie juste au dessus de time_diff dans le fichier core/class/scenarioExpression.class.php, il y a la façon de faire pour transformer un numèro de commande en son résultat.

public static function time_between($_time, $_start, $_end) {
		$_time = self::setTags($_time);

Cela donnerait pour la fonction Mytime_diff: (voir la discussion citée pour où la mettre )

public function Mytime_diff($_date1, $_date2, $_format = 'd',$_rnd = 2) {
    $d1 = scenarioExpression::setTags($_date1);
    $date1 = new DateTime($d1);
    $d2 = scenarioExpression::setTags($_date2);
    $date2 = new DateTime($d2);
    $duree = $date2->getTimestamp() - $date1->getTimestamp();
    $dureeAbs = abs($duree);
    switch( trim($_format )) {
      case 's': return $dureeAbs; // en secondes
      case 'sf': return $duree;   // en secondes avec signe
      case 'm': return floor($dureeAbs/60); // en minutes
      case 'mf': return round($duree/60,$_rnd); // en minutes décimales avec signe
      case 'h': return floor($dureeAbs/3600); // en heures
      case 'hf': return round($duree/3600,$_rnd); // en heures décimales  avec signe
      case 'dhms':
        $j = floor($dureeAbs/86400); $dureeAbs %= 86400;
        $h = floor($dureeAbs/3600); $dureeAbs %= 3600;
        $m = floor($dureeAbs/60); $dureeAbs %= 60;
        $s = $dureeAbs;
        $ret = '';
        if ($j > 0) $ret .= "${j}j ";
        if ($h > 0) $ret .= "${h}h ";
        if ($m > 0) $ret .= "${m}min ";
        if ($s > 0) $ret .= "${s}s";
        return(trim($ret));
      case 'df': return round($duree/86400,$_rnd); // en jours decimaux avec signe
      default: return floor($dureeAbs/86400); // en jours
    }
  }

Par rapport au PR fait à @Loic et intégré en alpha, j’ai ajouté le format sf pour avoir les secondes signées suivant l’ordre des arguments.
Les formats mf, hf, df et sf retourne des valeurs décimales signées.
Ajout du paramètre optionnel $_rnd pour contrôler les arrondis des valeurs décimales.
Et avec la modif ci-dessus, les numéros de commande sont acceptés pour les 2 arguments date.
@Loic nouveau PR ? Dites moi s’il faut utiliser strtotime ou (new Datetime avec php 5.3 mini pour getTimestamp)

1 « J'aime »

Merci @jpty
J’ai l’impression que le plugin de @nebz est un des seuls à retourner une date, celui du UPtime de la Freebox retournait une date mais visiblement maintenant il a été modifié en Jours/Heure/M/S

Les dates et l’informatique une longue histoire :slight_smile: depuis les representations sur 7 octets voir moins

Je n’ai aucun plugin de nebz ni de freebox
Pour moi en interne une date, c’est un timestamp qui est ensuite formaté pour l’affichage.

Seem legit, c’est la seule manière de pouvoir être certain de pouvoir manipuler les dates, du moins avant 2038
Avec le format ISO du coup :slight_smile:

En testant time_diff, je me suis aperçu que cette année , j’aurai 24000 jours d’existence.:birthday:
Alors 2038 pour moi …

Merci pour le badge solution.

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.