Nombre de minutes entre deux #time#

Salut,

Je farfouille sans trouver ma réponse…
Je cherche a calculer la différence en minutes entre deux #plugin-wazeintimeLe problème étant que bienevidemment 700 - 659 ne donne pas 1minute mais 41.

Le but étant de stocker l’heure du lever du soleil de la veille, ainsi que le coucher, et les comparer avec ceux du jour, pour calculer le nombre de minutes gagnées ou perdues.

J’ai essayé avec pas mal de formules comme time_diff ou time_op mais rien a faire, je ne trouve pas.

(peut etre qu’un plugin donne l’info, mais pas envie d’installer un plugin « juste » pour ca.)

Merci, A+ !

il y a pas mal de méthodes en php pour les calcul des dates / heures

regarde ici aussi (tuto) utilisation de la commande php date_sun_info

tu devrait trouver ce que tu cherche.

1 « J'aime »

Et donc dans ce cas tu veux obtenir 0 minute ou 1 minute (pour 41 secondes) ?

@olive J’ai pas pensé au php (que je maitrise dailleurs…), je vais voir dans ce coin ce sera plus facile pour moi.

@Bison : 700 = 7h00 et 659 = 6h59 donc dans la théorie 1minute (pas de seconde la dedans) au lieu de 51 qu’il me donne.

1 « J'aime »

yes en faite tu converti tes heures en timestamp, tu fait l’opération sur des secondes puis reconverti en heures minutes secondes … ou dans le format que tu a besoin.

J’avais lu un peu rapidement la question pardon :slight_smile:

1 « J'aime »

( floor(700/100)*60+(700%100) ) - ( floor(659/100)*60+(659%100) )

Cela devrait marcher sauf si y’a minuit au milieu :grin:

Mais j’irais quand même chercher du côté du timestamp et des fonctions php comme suggéré, peut-être plus simple (surtout qu’elles peuvent s’utiliser directement dans les virtuels par exemple).

Edit : version simplifiée

2 « J'aime »

bonjour
HS
dans un scénario faisant tous

  • met en variable
  • déclenche scénario +/- mn (cron)
  • dif veille

$deltadif = ($deltajour) - ($deltahier);

[2020-03-13 23:40:57][SCENARIO] Start : Scenario lance manuellement.
[2020-03-13 23:40:57][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-03-13 23:40:57][SCENARIO] Exécution d’un bloc code
[2020-03-13 23:40:57][SCENARIO] Levée - Couchée Soleil : 0702 - 1845
[2020-03-13 23:40:57][SCENARIO] Levée - Couchée Soleil hier : 07:04 - 18:44
[2020-03-13 23:40:57][SCENARIO] la journée dure : 1143
[2020-03-13 23:40:57][SCENARIO] hier la journée dure : 1140
[2020-03-13 23:40:57][SCENARIO] la différence : 3 mn
[2020-03-13 23:40:57][SCENARIO] Fin correcte du scénario

1 « J'aime »
function diffTimeSunrise ($sunriseYesterday,$sunriseToday) {
	$before = false;
	if($sunriseYesterday > $sunriseToday) {
		$before = true;	
	} 

	strlen($sunriseYesterday) == 3 ? $sunriseYesterday = substr_replace($sunriseYesterday,':',1,0) :  $sunriseYesterday = substr_replace($sunriseYesterday,':',2,0);
	strlen($sunriseToday) == 3 ? $sunriseToday = substr_replace($sunriseToday,':',1,0) : $sunriseToday = substr_replace($sunriseToday,':',2,0);

	$yesterday = new DateTime($sunriseYesterday);
	$today = new DateTime($sunriseToday);

	$diff = $yesterday->diff($today);
	$diffTime = $diff->format('%i');
	if($before) {
		return "Il y a $diffTime minute en plus";
	} else {
		return "Il y a $diffTime minute en moins";
	}
}

echo diffTimeSunrise(700,659);

Temps que l’on en est la pourquoi ne pas inclure directement le sunrise dans la fonction et tant que l’on y est si c’est pour faire comme a la météo dire le temps en plus faire le calcul sur les différence
de temps de jour, qui sont l’addition des différences levés et couchés.

le temps de jour on l’a dans le script donné plus haut

// separation de la latitude et de la longitude
$latlon = explode(",", $argv[1]);
// utilisationde la commande date_sun_info https://www.php.net/manual/fr/function.date-sun-info.php
$sun_info = date_sun_info(time(),$latlon[0],$latlon[1]);

// calcul durée du jour
$jour = $sun_info["sunset"]-$sun_info["sunrise"];

Il suffit juste de faire le même calcul sur la veille et de differencier les 2

Je pourrait écrire toute la solution mais ce serait beaucoup moins jouissif pour celui qui la cherche.

Comme mentionné par @olive, perso, dés qu’il s’agit de temps/durée etc…je passe toujours par des timestamp (en secondes donc) comme ca tu peux faire toutes les opérations d’additions /soustraction intermédiaires que tu veux et aprés je traduit selon mes besoins (selon ton cas, besoin d’une diff en chiffres ,ou pour une vocalisation de durée en heures minutes secondes, etc).

Si ca peut t’aider, fait une variation sur le theme de cette fonction que j’utilise à toute les sauces (ou prend tel quel et extrait les minutes du tableau renvoyé):

/*************************
 * Transform des secondes en JOURS HH:MM:SS
 * Max 365 J sinon erreur
 * renvoi array avec
 * [0]= JOURS HH:MM:SS
 * [1]= x JOURS H Heures M Minutes S secondes
 * pour vocalisation Sarah/snips etc. Les valeurs nulles sont supprimées de la réponse 
 * 3 minutes 34 Secondes si pas d'heures, etc..
 * $DAYS=0 -> que des heures , $DAYS=1 -> Jours affiches SSI non nul, $DAYS=2 -> jours toujours affiches sur 3 digits
  *************************/

public static function HourMinSec($Time, $DAYS = 1) {
 global $scenario;

 $DEBUG = 0;
 $Result="";

 if ($DAYS == 0) {
	 $MAX=(24*3600);
 } else {
	 $MAX=(365*24*3600);
 } 

 if (( ($Time > $MAX) ) OR ("$Time" == "" ) ) {
	$scenario->setLog("ERROR : Invalid Time value ($Time) max=$MAX sec");
	return -1;		 
 } else {
	if ($Time == 0 ) {
		$RES = array ( "00:00:00", "0 Secondes");
		return $RES;
	} else {
		//$TimeY =  floor($Time / (365*24*3600));
		$TimeD = floor( ($Time / (24*3600)) );
		$TimeH = floor( ($Time / 3600) % 24);
		$TimeM = floor( ($Time / 60) % 60) ;
		$TimeS = ($Time % 60);
	
		if ($TimeD != 0) { 			$Result = sprintf("%d Jours",$TimeD); 		} ;
		if ($TimeH != 0) { 			$Result = $Result.sprintf(" %d Heures",$TimeH); 		} ;
		if ($TimeM != 0) { 			$Result = $Result.sprintf(" %d Minutes",$TimeM); 		} ;
		if ($TimeS != 0) { 			$Result = $Result.sprintf(" %d Secondes",$TimeS); 		} ;
	
		// $res = sprintf ("%02d Years %03d Days %02d:%02d:%02d",$TimeY, $TimeD, $TimeH, $TimeM, $TimeS); 
		if ($DAYS == 0) {
			$ResultShort = sprintf ("%02d:%02d:%02d", $TimeH, $TimeM, $TimeS); 
		} else {
			if (($TimeD != 0) || ($DAYS == 2)) {
				$ResultShort = sprintf ("%03dJ %02d:%02d:%02d", $TimeD, $TimeH, $TimeM, $TimeS); 
			} else {
				$ResultShort = sprintf ("%02d:%02d:%02d", $TimeH, $TimeM, $TimeS); 
			}
		}
		if ($DEBUG == 1) { $scenario->setLog("$ResultShort - $Result"); };
		$RES = array ( "$ResultShort", "$Result");
		return $RES;
	}
};
} // END Function

à mettre dans ton user.function.class.php

2 « J'aime »