Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Differenza ore

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    142

    Differenza ore

    Salve a tutti, come da oggetto devo fare la differenza tra due orari che hanno questo formato:

    Codice PHP:
    $inizio=2022-03-21 23.00
    $fine
    2022-03-22 05.05 
    essendo oggetti datetime, stavo utilizzando la funzione diff di datetime:

    Codice PHP:
    $differenzadate_diff($fine,$inizio); 
    il problema � che la differenza che mi d� � 6.5 invece dovrebbe essere 6.05 ho provato anche utilizzando:

    Codice 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:

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

    function 
    differenzaore($ora2$ora1){
            
    $sep=':';
                         
            
    $part explode($sep$ora1);
            
    $arr explode($sep$ora2);
            
    $diffmktime($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.

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    528
    risultato,
    Cattura.GIF

    codice
    codice:
    <?php$inizio = "2022-03-21 23.00";
    $fine   = "2022-03-22 05.05";
    
    
    $diff = date_create($fine)->diff( date_create($inizio) );
    
    
    echo $diff->y. " year "
       . $diff->m. " month "
       . $diff->d. " day "
       . $diff->h. " hour "
       . $diff->i. " minute "
       . $diff->s. " second";
    ?>

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    142
    ciao marino51, come anticipato nel mio post, ->diff è un'ottima funzione, ma restituisce $diff->m=5 e non $diff->m=05, che sono due cose molto diverse

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    528
    scusa non avevo percepito che fosse necessario anteporre lo zero per valori inferiori a 10,
    puoi usare "format" aggiustandolo secondo la necessita'

    codice:
    // differenza tra due date con ora solare ------------
    
    
    $inizio = "2022-03-21 23.00";
    $fine   = "2022-03-22 05.05";
    
    
    $diff = date_create($fine)->diff( date_create($inizio) );
    
    
    echo $fine   . " - "
       . $inizio . " = "
       . $diff->format("Time difference = %Y Years %M Months %D Days %H Hours %I Minutes %S Seconds")
       . "<br /><br />";
    
    
    // differenza tra due date con ora legale ------------
    
    
    $inizio = "2022-03-26 23.00";
    $fine   = "2022-03-27 05.05";
    
    
    $diff = date_create($fine)->diff( date_create($inizio) );
    
    
    echo $fine   . " - "
       . $inizio . " = "
       . $diff->format("Time difference = %Y Years %M Months %D Days %H Hours %I Minutes %S Seconds")
       . "<br /><br />";
    verifica anche il giorno con il cambio dell'ora ....

    Cattura.GIF

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    528
    scusa ho cambiato il "format" nell'immagine, per superare il limite delle dimensioni poste dal forum

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    190
    Il formato della data è 2022-03-21 23:00.040000 è il punto corrisponde alla frazione disponibile già da php 5.2.2
    La differenza di 0 minuti - 5 minuti è proprio 5 minuti non 05 che per qualche motivo ancora sconosciuto (Puoi indicare il perché?) ti occorre.

    Ecco l'esempio con uno dei tanti bug (creando il codice mi sono reso conto che l'aritmetica DateTime va migliorata,
    grazie) quando ci sono calcoli.
    https://3v4l.org/sh3pU
    -365 days mentre se imposto 000002 al posto di 000001 e viceversa per il secondo oggetto DateTime ottengo +364 days
    Il formato i DateInterval significa numero intero senza preceduto da zero, che differisce da DateTime se inferiore a 10 aggiunge 0. Come da codice usa I direttamente per la funzione format del tuo oggetto DateInterval creato dall'oggetto diff, Domanda successiva: Quanti format esistono? Risposta più di uno il format per DateTime è diverso
    Ultima modifica di darbula; 22-03-2022 a 01:33

  7. #7
    Utente di HTML.it L'avatar di ttcc
    Registrato dal
    Dec 2008
    Messaggi
    487
    sono capitato proprio nel momento in cui si sta migrando.
    Comunque non so se ho capito bene. Tempo fa ho avuto un problema di questo tipo. L'ho risolto così:
    Codice PHP:
    $inizio="2022-03-21 23.00";
    $fine"2022-03-22 05.05";
    $date1=date_create($inizio);
    $date2=date_create($fine);
    $diff=date_diff($date1,$date2);

    echo 
    $diff->format("Ore: %H, MInuti: %I."); 

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    142
    Si, infatti non ho potuto rispondere prima.
    ttcc date_diff l'ho provata e dà lo stesso risultato di ->diff.
    Rispondo anche a dabula dicendo che a me serve 05 e non 5 perchè le ore ed i minuti li devo poi sommare, se sommo 5.5 con 5.45, il risultato è 5.95, se sommo 5.05 con 5.45, il risultato 5.50, spero di avervi fatto capire il motivo della mia richiesta, quindi non mi è utile farmi stampare Ore 5, Minuti 5.

    Ho provato il tuo metodo darbula e sembra funzionare, spero che sia valido per ogni tipo di input. In alternativa avevo modificato anche quella che avevo postato all'inizio: differenzaore, in questo modo

    codice:
    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, per gli orari che si accavallano su due giorni, controllo se $ora2 è più piccola vuol dire che mi trovo al giorno successivo e quindi aggiungo 24 alle ore, non so quanto sia corretto, ma anche questo sembra funzionare

  9. #9
    Utente di HTML.it L'avatar di ttcc
    Registrato dal
    Dec 2008
    Messaggi
    487
    strano. Ho provato nel mio server e funziona. "%I" la " i " deve essere maiuscola non minuscola.
    codice HTML:
    https://www.php.net/manual/en/dateinterval.format.php

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    142
    Non so che dirti, facendo:

    codice:
    $diffe=date_diff($ora_fine,$ora_inizio);
    $diffe->format('%H:%I');
    $diffe contiene:

    codice:
    (
        [y] => 0
        [m] => 0
        [d] => 1
        [h] => 16
        [i] => 5
        [s] => 0
        [f] => 0
        [weekday] => 0
        [weekday_behavior] => 0
        [first_last_day_of] => 0
        [invert] => 1
        [days] => 1
        [special_type] => 0
        [special_amount] => 0
        [have_weekday_relative] => 0
        [have_special_relative] => 0
    )

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.