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.
 

zorro

Utente Attivo
20 Ott 2014
322
21
28
ROMA
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
 

wolfland

Nuovo Utente
14 Lug 2015
16
0
1
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.
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
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
Autore Titolo Forum Risposte Data
M PHP Arrotondamento minuti in differenza tra due Orari PHP 9
S Differenza tra orari sballata! PHP 2
E Query differenza tra tabelle MySQL 5
A differenza tra account email e ISP presenti in blacklist Posta Elettronica 0
Gabriele Visioli Differenza tra hosting e hosting WordPress Hosting 4
S Differenza tra le funzioni include () e require ()? PHP 1
U [PHP] Differenza tra amministratore e utente PHP 2
V [PHP] Differenza reale tra bindParam e bindValue PHP 8
Z Google: qual'è la differenza tra Popolarità e Autorevolezza di un sito? SEO e Posizionamento 1
M Qual'è la differenza tra Server.Transfer e Response.Redirect? ASP.NET 1
Giacomo92 Differenza tra Webmaster e Web designer? Webdesign e Grafica 2
V Calcolare la differenza tra due date in PHP PHP 1
V Differenza tra operatori == e === in javascript? Javascript 1
felino [C#] Differenza tra ClipboardPasted e ClipboardPasting .NET Framework 2
F differenza tra 2 date PHP 5
M Calcolare differenza temporale tra datetime salvati sui records di una tabella mysql PHP 18
Monital Differenza tra int smallint etc. Database 5
A Differenza tra anteporre o posporre l'operatore di incremento nel ciclo for Javascript 5
C Differenza tra due ore PHP 17
PenguinLover Differenza tra detrazioni e deduzioni? Leggi, Normative e Fisco 3
Monital Differenza tra date PHP 8
YellowMan Differenza tra Server Virtuale e Cloud Server Cloud Computing e Cloud Server 1
M Differenza tra precision e scale PHP 2
novello88 Differenza tra include() e require() PHP 18
M [VB.Net] Che differenza c'è tra CType e DirectCast? ASP.NET 1
S Differenza tra queste righe di codice Javascript 2
M Differenza tra richiesta sincrona e asincrona Ajax 0
emanuelevt differenza tra $array[]='valore' o array_push($array,'valore') PHP 2
emanuelevt differenza concreta tra array_rand e shuffle PHP 2
SolidSnake4 differenza tra sleep() e microtime() PHP 9
M Differenza tra date e countdown PHP 3
M Differenza tra valori sulla stessa colonna Database 10
A Differenza comportamento tra click mouse e pressione tasto invio Visual Basic 0
borgo italia differenza tra applet e script? Javascript 10
I Differenza tra blog e sito Webdesign e Grafica 12
E Differenza tra utenti e hits [Era: Statistiche accessi al sito] Discussioni Varie 2
B Che differenza c'è tra un sito professionale e uno no ? Webdesign e Grafica 7
V Differenza di visualizzazione tra IE e FireFox HTML e CSS 4
S Differenza date record successivi MS Access 7
T differenza fra mysql xampp e un mysql server Database 0
Emix [PHP] Differenza Date + Ore PHP 3
S [PHP] Eseguire differenza su dati SQL presenti sulla stessa colonna PHP 1
K Certificato SSL (https) gratuito o a pagamento? che differenza c'è? Server Dedicati e VPS 1
andrea.peo Calcolo differenza fra record attivo e precedente PHP 1
G Calcolo differenza valori provenienti da una tabella PHP 0
giap Classi stili/stili per singoli TAG- differenza- HTML e CSS 2
S Differenza data PHP 1
C Ma perchè!!!! Differenza visualizzazione con iOS Safari HTML e CSS 2
Shyson Differenza UTF-8 e gli altri HTML e CSS 12
L Reale differenza con il precedente HTML HTML e CSS 1

Discussioni simili