Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    173

    Calcolo fra due ore precise

    Salve a tutti,
    io ho due orari in php passati in un form con il metodo POST.
    Solo che quando vado a calcolare mi da il numero di ore preciso... mi spiego meglio!
    Supponiamo che l'ora d'inizio sia le 9.30 e l'ora di fine sia le 14.00, quando vado a fare la sottrazione (come da matematica) mi restituisce 4.7.
    Il problema è che non vorrei che mi restituisse 4.7 ma 5.10 (5 ore e 10 minuti) perchè superato il 6 dopo la virgola scatta l'altra ora.... non so se mi sono spiegato bene.

    Posto il codice per maggiori dettagli

    Codice PHP:
    $cerca = array(":",",",";",".");            
    $ora_inizio str_replace($cerca,".",$_POST['ora_inizio']);    
    $ora_fine str_replace($cerca,".",$_POST['ora_fine']);        
            
              if(!
    $ora_inizio OR !$ora_fine){        
                   echo 
    "I campi non possone essere vuoti";    
              }else{    
                   echo 
    $ora_inizio."<br>";      
                   echo 
    $ora_fine;        
                   echo 
    "<hr>";        
                   
    $result $ora_fine $ora_inizio;   
                   echo 
    $result;
            } 

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Beh, se converti un orario come 9:30 in 9.30 adesso hai un numero decimale 9.3 quindi è chiaro che PHP interpreti la sottrazione come una normale operazione matematica, che ne sa che all'inizio era un orario?
    Dato questo fatto, non puoi operare semplicemente in questo modo.

    Quello che farei io:
    - conversione entrambi orari con strtotime()
    - sottrazione orario più alto - orario più basso
    - divisione del numero ottenuto per 3600

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    173
    Esce un numero periodico, errato anche.
    Come faccio ad arrotondarlo? Ho provato con la funzione ceil, ma me lo arrotonda troppo!
    Ultima modifica di Joisberg; 29-06-2016 a 10:42

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    A me viene preciso, provato con 9:00 14:00 e il risultato è 4.5 (4 ore e mezza)

    Fa vedere il codice che hai scritto.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    173
    ho cambiato codice provando così
    Codice PHP:
    function differanza_data($prima,$seconda){          
    $p=explode(":"$prima);      
    $s=explode(":"$seconda);      
    $diff_sec=($p[0]*60 $p[1])-($s[0]*60 $s[1]);      
    $dif_minuti=(int)($diff_sec/60);      
    $dif_secondi=abs((int)($diff_sec%60));      
    $dif_minuti=($dif_minuti<10 "0" "").$dif_minuti;     
    $dif_secondi=($dif_secondi<10 "0" "").$dif_secondi;       

    return 
    "$dif_minuti:$dif_secondi";  


    $cerca = array(":",",",";",".","-");    
    $primo str_replace($cerca,":",$_POST['ora_inizio']);      
    $secondo str_replace($cerca,":",$_POST['ora_fine']);     
    echo 
    "diferenza tra $secondo e $primo = ".differanza_data($secondo,$primo)."<br />"

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    E funziona, giusto?

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    173
    Si. Ti spiego meglio a cose mi serve.
    Le ore devono essere moltiplicate per una certa tariffa ad esempio 1,50 euro. Però se faccio il calcolo mi dà un numero errato anche stavolta. Il problema comunque non sorge per le ore intere tipo fra le 15 e le 18, ma ad esempio fra le 15.15 e le 18.45.
    Per quanto riguarda la moltiplicazione mi conviene moltiplicarla per il metodo che mi hai detto tu? Ovvero:

    - conversione entrambi orari con strtotime()
    - sottrazione orario più alto - orario più basso
    - divisione del numero ottenuto per 3600
    - moltiplicazione del numero ottenuto per il prezzo (questo è giusto?)

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Ma l'ultimo codice che hai postato non fa già ciò che ti serve?

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    173
    In teoria non tutto, vorrei che la prima parte mi mostrasse le ore belle formattate.
    Mentre la seconda mi deve mostrare la differenza matematica fra due ore e calcolarne il prezzo totale.
    Ti posto il codice completo

    Codice PHP:
    function differenza_data($prima,$seconda){          
    $p=explode(":"$prima);      
    $s=explode(":"$seconda);      
    $diff_sec=($p[0]*60 $p[1])-($s[0]*60 $s[1]);      
    $dif_minuti=(int)($diff_sec/60);      
    $dif_secondi=abs((int)($diff_sec%60));      
    $dif_minuti=($dif_minuti<10 "0" "").$dif_minuti;     
    $dif_secondi=($dif_secondi<10 "0" "").$dif_secondi;       

    return 
    "$dif_minuti:$dif_secondi";  


        
    $cerca = array(":",",",";",".","-");   
         
    $primo str_replace($cerca,":",$_POST['ora_inizio']); 
         
    $secondo str_replace($cerca,":",$_POST['ora_fine']);     
         echo 
    "diferenza tra $secondo e $primo = ".differenza_data($secondo,$primo)."<br />";        echo "<hr>";            
    $cerca = array(":",",",";",".","-");    
    $primo str_replace($cerca,".",$_POST['ora_inizio']);      
    $secondo str_replace($cerca,".",$_POST['ora_fine']);         
    $primo strtotime($primo);    
    $secondo strtotime($secondo);    
    $differenza $secondo-$primo;    
    echo 
    "ore in secondi: ".$differenza $differenza/3600;    
    echo 
    "<br>";    echo "pausa: ";    
    echo 
    strtotime(0.15); //Dovrebbe tirarmi fuori il numero di secondi che ci sono in 15 minuti    
    echo " secondi";        
    echo 
    "<br>ore per prezzo: ".$differenza $differenza*1.50;   
    echo 
    "<br>";    echo "ore per prezzo arrotondate: ".round($differenza,2); 
    Risultato dove ora inizio = 8.30 e ora fine = 11.15

    Cattura.PNG

    Non ho ancora sottratto la pausa perchè non so se è giusta in quel modo!
    Ultima modifica di Joisberg; 29-06-2016 a 13:08

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.