v8.1 - Hour count in form

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