I would like to enter two fields given with minutes in a form, and in other fields count the time difference in hours
function dm_difftime($ptime1, $ptime2, $ptipoout="M", $plenghtH=2, $pseparator=":") {
// differenza tra 2 orari
// i minuti e i secondi sono sempre elaborati se inviati in $ptime1 e/o in $ptime2
// $ptime1 e $ptime2 = ora iniziale e finale nel formato 09:00:00 oppure 09:00
// $ptipoout = tipo stringa di output/return :
// H = ritorna differenza nel formato ora (09)
// HM = ritorna differenza nel formato Ora:Minuti : 09:00
// HMS = ritorna differenza nel formato Ora:Minuti:Secondi : 09:00:00
// D = ritorna differenza nel formato decimale 2,25 per intendere 2 ore e un quarto di ora (2:15), 2,5 per 2 ore e mezzo
// M = ritorna differenza in minuti
// S = ritorna differenza in secondi
// A = array ore e minuti e secondi (arr("h")=h, arr("m")=m, arr("s")=s)
// $plenghtH = lunghezza della stringa 'ora' riempita con zeri a sx
// $pseparator : simbolo di separazione tra ore e minuti nella stringa di ritorno
$ptipoout = trim(strtoupper($ptipoout));
if(is_string($ptime1)) {
$ptime1 = date_create($ptime1);
}
if(is_string($ptime2)) {
$ptime2 = date_create($ptime2);
}
if (empty($ptime1) || empty($ptime2) || $ptime1 > $ptime2) {
$dh = 0;
$dm = 0;
$ds = 0;
}else{
$diff = date_diff($ptime1, $ptime2);
//$dh = $diff->format("%H");
//$dm = $diff->format("%i");
//$ds = $diff->format("%s");
$dh = $diff->h;
$dm = $diff->i;
$ds = $diff->s;
}
return transform_time($ptipoout, $dh, $dm, $ds, $plenghtH, $pseparator);
}
// ---------------------------------------
function convert_time($pdms, $ptipoin="M", $ptipoout="HM", $plenghtH=2, $pseparator=":") {
// converte minuti ($pdms) in ore (con lunghezza $plenghtH con zeri a sx) e minuti
// $ptipoin = tipo stringa in input :
// H = ore
// HM = ore:minuti
// HMS = ore:minuti:secondi
// M = in minuti
// S = in secondi
// D = in decimale
// $ptipoout = tipo stringa di output/return :
// H = ritorna stringa nel formato ora (09)
// HM = ritorna stringa nel formato Ora:Minuti : 09:00
// HMS = ritorna stringa nel formato Ora:Minuti:Secondi : 09:00:00
// D = ritorna numero nel formato decimale 2,25 per intendere 2 ore e un quarto di ora (2:15), 2,5 per 2 ore e mezzo
// M = ritorna minuti
// S = ritorna secondi
// A = array ore e minuti e secondi (arr("h")=h, arr("m")=m, arr("s")=s)
// $plenghtH = lunghezza della stringa 'ora' riempita con zeri a sx
// $pseparator : simbolo di separazione tra ore e minuti nella stringa di ritorno
$ptipoin = trim(strtoupper($ptipoin));
$ptipoout = trim(strtoupper($ptipoout));
if (empty($ptipoin) || empty($ptipoout) || empty($pdms)) {
return "";
}
// ---> si converte tutto in secondi :
if ($ptipoin == "M") {
// da minuti a secondi
$s = ($pdms * 60);
}elseif($ptipoin == "D") {
// da decimale a secondi (decimale si intente 2,25 = 2 ore e 15minuti)
// conversione della parte decimale in 60esimi : 3600:x=decimali:x
$s = (intval($pdms)*60*60) + (3600*(($pdms-intval($pdms))*100)/100);
}elseif($ptipoin == "S") {
// secondi
$s = $pdms;
}elseif($ptipoin == "H") {
// in ore
$arr = explode(":", $pdms);
$s = ($arr[0]*60*60);
}elseif($ptipoin == "HM") {
// in ore/minuti
$arr = explode(":", $pdms);
$s = ($arr[0]*60*60)+($arr[1]*60);
}elseif($ptipoin == "HMS") {
// in ore/minuti/secondi
$arr = explode(":", $pdms);
$s = ($arr[0]*60*60)+($arr[1]*60)+$arr[2];
}else{
// ERRORE tipoin
}
$dh = intval($s/60/60);
$dm = intval(($s-($dh*60*60))/60);
$ds = round($s-($dh*60*60)-($dm*60));
//
return transform_time($ptipoout, $dh, $dm, $ds, $plenghtH, $pseparator);
}
// ---------------------------------------
function transform_time($ptipoout, $pdh, $pdm, $pds, $plenghtH, $pseparator) {
// function interna, non richiamabile direttamente
switch ($ptipoout) {
case "H":
return sprintf("%02d", $pdh);
break;
case "HM":
return sprintf("%0".$plenghtH."d", $pdh).$pseparator.sprintf("%02d", $pdm);
break;
case "HMS":
return sprintf("%0".$plenghtH."d", $pdh).$pseparator.sprintf("%02d", $pdm).$pseparator.sprintf("%02d", $pds);
break;
case "D":
return $pdh+($pdm/60)+($pds/60/60);
break;
case "M":
return ($pdh*60)+$pdm;
break;
case "S":
return ((($pdh*60)+$pdm)*60)+$pds;
break;
case "A":
return array("h" => $pdh, "m" => $pdm, "s" => $pds);
break;
default :
// ptipoout = "M"
return ($pdh*60)+$pdm;
break;
}
return 0;
}
// ---------------------------------------
In the future days if you want I will translate the comments!
Ciao
Enrico
Ciao Enrico, scusami un altro aiutino, vorrei implementare il codice che possa creare un campo per esempio ore totali e faccia il conto dei due campi datetime ,per conteggiare il tempo di arrivo ed uscita
funzione con tutti i parametri :
// ------------------
// funzione con tutti i parametri
$mm0 = 100;
$mm1 = 70;
// converto
$cmm0 = convert_time($mm0, $ptipoin="M", $ptipoout="HM", $plenghtH=2, $pseparator=":");
$cmm1 = convert_time($mm1, $ptipoin="M", $ptipoout="HM", $plenghtH=2, $pseparator=":");
// differenza
$diffhm = dm_difftime($cmm1, $cmm0, $ptipoout="HM", $plenghtH=2, $pseparator=":");
$diffmm = dm_difftime($cmm1, $cmm0, $ptipoout="M", $plenghtH=2, $pseparator=":");
echo "h:m di 0=".$cmm0."- h:m di 1=".$cmm1." diff h:m = ".$diffhm."<br />";
echo "h:m di 0=".$cmm0."- h:m di 1=".$cmm1." diff mm = ".$diffmm."<br />";
oppure con i parametri default :
$mm0 = 100;
$mm1 = 70;
// funzione con i valori di default :
// converto
$cmm0 = convert_time($mm0);
$cmm1 = convert_time($mm1);
// differenza
$diffhm = dm_difftime($cmm1, $cmm0, $ptipoout="HM");
$diffmm = dm_difftime($cmm1, $cmm0, $ptipoout="M");
echo "h:m di 0=".$cmm0."- h:m di 1=".$cmm1." diff h:m = ".$diffhm."<br />";
echo "h:m di 0=".$cmm0."- h:m di 1=".$cmm1." diff mm = ".$diffmm."<br />";
oppure … semplificata! :
// funzione con i valori di default tutto in uno!
$mm0 = 100;
$mm1 = 70;
echo "diff h:m = ".dm_difftime(convert_time($mm1), convert_time($mm0), $ptipoout="HM")."<br />";
echo " diff mm = ".dm_difftime(convert_time($mm1), convert_time($mm0), $ptipoout="M")."<br />";
ciao
enrico