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
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.
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
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