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
La fonction actuelle time_diff n’accepte que des dates pas de numéro de commande (#1664# ça donne soif ).
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)
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 depuis les representations sur 7 octets voir moins