Differenza tra orari

wolfland

Nuovo Utente
14 Lug 2015
16
0
1
Salve a tutti, come da oggetto devo fare la differenza tra due orari che hanno questo formato:

PHP:
$inizio=2022-03-21 23.00
$fine= 2022-03-22 05.05

essendo oggetti datetime, stavo utilizzando la funzione diff di datetime:

PHP:
$differenza= date_diff($fine,$inizio);

il problema è che la differenza che mi dà è 6.5 invece dovrebbe essere 6.05 ho provato anche utilizzando:

PHP:
$differenza= $fine->diff($inizio);

ma il risultato è identico, è un peccato perchè è di facile utilizzo e funziona perfettamente per tutti i valori che abbiano i minuti in doppia cifra, quindi da 10 in poi. Non so se esiste un settaggio da fare, non ho trovato nulla.

Ho trovato poi quest'altra funzione che fa quello che chiedo:

PHP:
$ora2=$fine->format('H:i');
$ora1=$inizio->format('H:i');

function differenzaore($ora2, $ora1){
        $sep=':';
                    
        $part = explode($sep, $ora1);
        $arr = explode($sep, $ora2);
        $diff= mktime($arr[0], $arr[1]) - mktime($part[0], $part[1]);
        $ore=floor($diff / (60*60));
        $minuti=($diff / 60) % 60;
        $ore = str_pad($ore,2,0,STR_PAD_LEFT);
        $minuti = str_pad($minuti,2,0,STR_PAD_LEFT);
        $risultato = $ore.":".$minuti;
        return $risultato;
    }

Anche questa funziona perfettamente, ma non per tutti i casi, per orari dello stesso giorno è perfetta, ma per orari che si trovano a cavallo dei due giorni (come da esempio), il calcolo non viene eseguito bene.
Qualcuno sa come risolvere il problema con uno dei metodi visti sopra? Grazie.
 
Avevo il tuo stesso problema e l'ho risolto molto semplicemente: non credo esista una funzione che faccia ciò che chiedi, e cioè di anteporre uno 0 al numero, in caso questo sia minore di 10, d'altra parte non avrebbe senso scrivere un numero 05; ma nulla vieta di crearla tu stesso. Tramite la funzione
PHP:
strpos();
individui che posto occupa il punto, quindi, tramite la funzione
PHP:
substr();
recuperi ore e minuti dopodiché, con una if, ti chiedi se il numero è minore di 10 gli anteponi uno '0'. Occhio che lo 0 deve essere racchiuso tra apici, trasformando il numero in una stringa; a questo punto non ti resta che ricostruire il risultato:
$ore (che, dal tuo esempio, da 6 son diventate 06) .'.'. $minuti (da 5 a 05). Se ti serve il codice....chiedi pure. ciao
 
Speravo esistesse qualcosa di più "ufficiale", tutte le soluzioni che vedo agiscono sulla stringa ore.minuti:

POSSIBILE SOLUZIONE 1:
Ho modificato la funzione differenzaore in questo modo:

PHP:
function differenzaore($ora2, $ora1){
        $sep=':';
                                
        $part = explode($sep, $ora1);
        $arr = explode($sep, $ora2);
        
        if($arr[0]<$part[0]){
            $diff= mktime($arr[0]+24, $arr[1]) - mktime($part[0], $part[1]);
        }else{
            $diff= mktime($arr[0], $arr[1]) - mktime($part[0], $part[1]);
        }
        
        
        $ore=floor($diff / (60*60));
        $minuti=($diff / 60) % 60;
        $ore = str_pad($ore,2,0,STR_PAD_LEFT);
        $minuti = str_pad($minuti,2,0,STR_PAD_LEFT);
        $risultato = $ore.":".$minuti;
        return $risultato;
    }

In questo modo, se $ora2 è minore di $ora1 significa che sto confrontando l'ora con il giorno successivo, quindi aggiungo 24 al numero di ore (non so quanto sia corretto, ma sembra che funzioni)

POSSIBILE SOLUZIONE 2:

al risultato ($output) di differenzaore o ->diff eseguo questa piccola procedura:

PHP:
$output = $differenza->i;


if(strlen($output . '') == 1)

$string = '0' . $output;

e poi ricostruisco l'ora:

Codice:
$risultato = $differenza->h.".".$output;

Poco elegante, ma anche questo sembra funzionare.

Poi c'è la tua soluzione.

Se non esiste un metodo migliore, dovrò optare per quella ottimale (non so quale sia), tra queste.
 
quella ottimale
ti ho già risposto su un'altro forum ma lascio la risposta anche qui,
con la seguente considerazione, la soluzione ottimale dipende da come impieghi il valore,
ho letto che devi usarlo in somme, cosa poco fattibile, essendo i minuti risultanti in sessantesimi e non in centesimi
lascio quindi lo script ridotto al minimo che soddisfa la necessità dello zero anteposto
PHP:
$inizio = "2022-03-21 23.00";
$fine   = "2022-03-22 05.05";

$differenza = date_create($fine)->diff( date_create($inizio) );

echo $differenza->format("%h.%I");  // <- ore e minuti con zero anteposto quando necessario ed il punto

risultato
1647976039813.png
 

Discussioni simili