Évolution des formats possible dans la fonction time_diff()

Bonjour

La fonction time_diff() permet les formats jours, heure, minute, secondes (par défaut, h, m, s)
mais je n’ai pas trouvé de solution simple pour avoir l’affichage de type
N jours, X heures, Y minutes, Z secondes.

Ce pourrait (si cela n’existe pas déjà) être utile d’avoir un format complémentaire

Il faut utiliser la fonction date.

https://www.php.net/manual/fr/function.date.php

1 « J'aime »

Pour l’affichage d’une durée en secondes en format lisible, j’utilise un widget:
Exemple:
image

1 « J'aime »

même réponse que jeandhom;

voir aussi gmdate()

Avec quel format pour le nombre de jours?

Ben tu recupere les timestamp avec U par exemple, valeur entière (soustraction puis division par jour)

1 « J'aime »

Avec time_diff et le dernier paramètre = ‹ s › on récupère déjà un nombre de secondes entre deux dates qu’il faut formater en j h m s.
Si j’utilise date ou gmdate avec le format ‹ Y-m-d H:i:s › on obtient une date en 1970 (normal puisque date attend un timestamp et qu’on lui donne une durée en secondes)

D’où ma question pour avoir un nombre de jours correct quel que soit la durée.

gmdate est mieux (timezone GMT) mais ça ne dépasse pas les 31 jours après le nombre de jour repasse à 1 (en février)

Edit:
On peut utiliser gmdate(‹ z\j H\h i\m\i\n s\s ›,$duree) avec $duree = le résultat de time_diff.
mais le résultat sera sous la forme 0j 1h 0min 4s Et pour le simplifier en 1h 4s il vaut mieux utiliser le widget ci-dessus.

J’utilise ce code dans un widget pour formater une durée:

<div class="cmd cmd-widget #history#" data-type="info" data-subtype="numeric" data-template="line" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
	<div class="content-xs">
		<span class="cmdName #hide_name#">#name_display# </span> <strong class="state"></strong>
	</div>
	<script>
		jeedom.cmd.update['#id#'] = function(_options){
			var cmd = $('.cmd[data-cmd_id=#id#]')
			cmd.attr('title','Date de valeur : '+_options.valueDate+'<br/>Date de collecte : '+_options.collectDate)
      var duree = _options.display_value;
      var j = Math.floor(duree/86400); duree %= 86400;
      var h = Math.floor(duree/3600); duree %= 3600;
      var m = Math.floor(duree/60);
      var s = duree%60;
      var txt = '';
      if (j) txt += j + 'j ';
      if (h) txt += h + 'h ';
      if (m) txt += m + 'min ';
      if (s) txt += s + 's ';
			cmd.find('.state').empty().append(txt +' (' + _options.display_value +'#unite#)');
			if(_options.alertLevel){
				if(_options.alertLevel == 'warning'){
					cmd.find('.content-xs').addClass('label label-warning')
					cmd.attr('data-alertlevel','warning');
				}else if(_options.alertLevel == 'danger'){
					cmd.find('.content-xs').addClass('label label-danger')
					cmd.attr('data-alertlevel','danger');
				}else{
					cmd.find('.content-xs').removeClass('label label-warning label-danger')
					cmd.attr('data-alertlevel','none');
				}
			}
		}
		jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'})
	</script>
</div>

Il est issu du widget core line et modifié pour avoir une durée lisible facilement plutôt qu’un nombre de secondes.

2 « J'aime »

pas mal jp

si non on peut jouer avec a Nombre total de jours, provenant de la méthode DateTime::diff() ou (unknown) sinon

Merci, je vais avoir de l’avance sur le nombre d’astuces/jours que vous m’imposez! :wink:

C’est ce qui est fait dans la fonction time_diff de Jeedom.
image

1 « J'aime »

ca compte pas ici @jpty c’est dans l’autre fil :wink:

Merci pour le widget :slight_smile:

Alors ici, je vous autorise à me donner un cœur.

3 « J'aime »

Bonjour à tous,

Voici la fonction Mytime_diff
C’est une version modifiée de time_diff acceptant le format ‹ dhms › en plus des formats existants ‹ d ›,‹ h ›,‹ m ›,‹ s ›
Ajout des formats ‹ mf ›, ‹ hf › et ‹ df › pour avoir les formats décimaux.
Vous pouvez la placer dans le fichier /var/www/html/data/php/user.function.class.php dans la classe userfunction

function Mytime_diff($_date1, $_date2, $_format = 'd') {
  $date1 = new DateTime($_date1);
  $date2 = new DateTime($_date2);
  $duree = abs($date2->getTimestamp() - $date1->getTimestamp());
  switch( trim($_format )) {
    case 's': return $duree; // en secondes
    case 'm': return floor($duree/60); // en minutes
    case 'mf': return round($duree/60,2); // en minutes décimales
    case 'h': return floor($duree/3600); // en heures
    case 'hf': return round($duree/3600,2); // en heures décimales 
    case 'dhms': {
      $j = floor($duree/86400); $duree %= 86400;
      $h = floor($duree/3600); $duree %= 3600;
      $m = floor($duree/60); $duree %= 60;
      $s = $duree;
      $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,2); // en jours decimaux
    default: return floor($duree/86400); // en jours
  }
}

Vous pouvez ensuite l’appeler à la place de time_diff

Merci @jpty

J’ai ajouté trim($_format) pour rendre la fonction tolérante aux espaces dans les appels

Ce serait idéal si le paramètre ‹ dhms › était pris en compte dans le core

	function xtime_diff($_date1, $_date2, $_format = 'd') {
	  $date1 = new DateTime($_date1);
	  $date2 = new DateTime($_date2);
	  $duree = $date2->getTimestamp() - $date1->getTimestamp();
	  if (trim($_format) == 's') return $duree; // en secondes
	  if (trim($_format) == 'm') return floor($duree/60); // en minutes
	  if (trim($_format) == 'h') return floor($duree/3600); // en heures
	  if (trim($_format) == 'dhms') {
	    $j = floor($duree/86400); $duree %= 86400;
	    $h = floor($duree/3600); $duree %= 3600;
	    $m = floor($duree/60); $duree %= 60;
	    $s = $duree;
	    $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));
	  }
	  return floor($duree/86400); // en jours
	}

Bonjour,

J’ai modifié la fonction Mytime_diff de mon post au-dessus pour ajouter le trim et des formats décimaux mf, hf et df
Il vaut mieux ne faire le trim qu’une seule fois.
J’ai aussi ajouter un abs sur la durée pour que les valeurs soient toujours positives quel que soit l’ordre des arguments date1 et date2
Et pour que ça soit inclus dans le core, il faut demander à @Loic

Bonjour
Fais un pr et je regarde si la fonction est assez simple pour quon l’accepte

Sur quelle branche ?

Concernant le ABS() je ne sais pas si c’est bien car dans certain cas on peut vouloir le signe

Exemple, j’ai deux détecteurs de mouvement, de chaque coté d’une porte, le signe me donne le sens de passage de la personne

Avec la fonction time_diff ?
En tout cas, la fonction actuelle ne retourne que des valeurs positives.