[PHP] Calcoli ore e minuti

armando31

Nuovo Utente
15 Ago 2015
21
0
1
Buongiorno a tutti,

vi chiedo aiuto per la questione in oggetto, ho cercato in giro (sia in rete che nel forum) ma non ho trovato nulla che faccia al mio caso:

Ho un DB mysql con una tabella con due campi di tipo INT uno ore l'altro minuti , dove inserisco il "tempo impiegato" es:

ore min
1 30

Il mio problema nasce nel sommare il tempo quando i minuti superano i 60 .

Se adesempio ho :

1 - 30

2 - 40

3 - 50

la somma mi viene calcolata come

6:120

invece che

8:00

ho provato con

PHP:
 if ($minuti > 59){
        $minuti  = $minuti - 60;
        $ore = $ore+ 1;

ma non funziona ....

Avete qualche idea ?

Grazie
 
Codice:
agendo sul totale dei due valori, sommati separatamente,

m1 = int(minuti / 60)    m1 va sommato alle ore (int = intero)
m2 = minuti - (m1 * 60)  m2 riporta i minuti eccedenti le ore

nel caso esposto (6 : 120)

m1 = 2
m2 = 0

ore = 6 + m1 = 8
min = m2     = 0

nel caso (6 : 130)

m1 = 2
m2 = 10

ore = 6 + m1 = 8
min = m2     = 10
 
Senza andare alle lunghe a ricavare nuovamente i valori con spiegazioni inutili, prova strtorime partendo dal 01-01-1970!
PHP:
//orari è di tipo array multidimensionale con all'interno ore e minuti
$orari=[[1,30],[2,40],[3,50]];
$sum=0;
foreach ($orari as $k=>$v){
   //passando a strtotime la data 1970-01-01 si parte da zero quindi il calcolo è presto che fatto!
   $local='1970-01-01 '.$v[0].':'.$v[1].':00';
   $sum+=strtotime($local);
}
echo date('H:i',$sum);
//08:00
/*************************************************************************/
//Pui anche utilizzare una funzione tipo questa che è la sintesi di quello sopra:
function sommaOreMinuti($array,$format='H:i'){
   $data=0;
   foreach ($array as $k=>$v){
      $local='1970-01-01 '.$v[0].':'.$v[1].':00';
      $data+=strtotime($local);
   }
   return date($format,$data);
}

echo sommaOreMinuti($orari);
 
Ultima modifica:
La S.V. è servita...
ma quando riuscirai a far funzionare lo script, prova ad usare tempi che superano le 24 ore, forse anche in quel caso vi saranno problemi con la soluzione che hai proposto
@marino51... Nel caso ci fosse bisogno di sommare oltre le 24 ore, l'operazione è talmente banale che non me lo aspettavo detto da te...
forse anche in quel caso vi saranno problemi con la soluzione che hai proposto
Per ottenere il risultato basta moltiplicare i giorni della differenza tra date * 24 e sommarli alle ore della differenza stessa....
PHP:
$orari=[[1,30],[2,40],[3,50],[12,33],[14,22]];
function sommaOreMinuti($array,$format='H:i'){
   $data=0;
   foreach ($array as $k=>$v){
      $local='1970-01-01 '.$v[0].':'.$v[1].':00';
      $data+=strtotime($local);
   }
   return date($format,$data);
}
$a=new Datetime(sommaOreMinuti($orari,'Y-m-d H:i'));
$b=new DateTime('1970-01-01 00:00:00');
$total=$a->diff($b);
echo 'marino51.... '. ($total->h + ($total->days*24)).':'.$total->i;

-----------
Per non lasciare nulla al caso e lavorare sugli interi utilizzando sempre la funzione di prima e ricalcolando semplicemente come suggerito da marino...
PHP:
function sumOver24($input){
   return ['h'=>intval($input/3600),'i'=>($input/60)%60,'s'=>$input%60];
}
echo join(':',sumOver24(strtotime(sommaOreMinuti($orari,'Y-m-d H:i'))));


t_.png
 
Ultima modifica:
Ultima modifica:
riprendo dalla mia prima risposta,
considerando $ore e $minuti le variabili in cui hai sommato i relativi valori,
puoi "sistemare" le ore e i minuti con
PHP:
$m1 = intval($minuti / 60);  // calcola le ore
$m2 = $minuti - ($m1 * 60);  // calcola i minuti che restano
$ore += $m1;
$minuti = $m2;

avresti potuto anche sommare i "soli" minuti, usando
PHP:
$sum += ( 60 * $ore + $minuti );  // somma dei minuti
ed al termine del loop di somma calcolando
PHP:
$ore = intval($sum / 60);  // calcolo delle ore
$minuti = $sum - $ore * 60;  // calcolo dei minuti

con questi codici lavori con valori interi e non usi le funzioni relative alle date / time,

ti sconsiglio di usare il codice proposto da MacusAdi
perché utilizza la funzione "strtotime" che lavora nella TimeZone (TZ) configurata sul server php
se la TZ non viene adeguatamente controllata (e lui non lo ha fatto) si ottengono risultati inaspettati
ti riporto il risultato ottenuto con 3 TZ diverse, come verifica (avrebbe dovuto essere 8:00)
upload_2019-5-8_1-33-11.png


ricorda,
meglio scrivere un codice semplice, facile da capire che spesso ha anche buone performances

il codice deve essere "robusto" non può e non deve essere influenzato da fattori esterni "casuali"

ps,
la funzione "intval" produce risultato diverso dalla pseudo "(int)" non sostituirla
 
Ultima modifica:
ti sconsiglio di usare il codice proposto da MacusAdi
perché utilizza la funzione "strtotime" che lavora nella TimeZone (TZ) configurata sul server php
Certo cambiando la timezone varia il risultato, i dati sulle app vanno scritti su base UTC ..
Che abbia lavorato in Cina ,New York o altrove la somma sarà sempre uguale utilizzando UTC...

il codice deve essere "robusto" non può e non deve essere influenzato da fattori esterni "casuali"

Questa è una convenzione non scritta ma largamente utilizzata da tutti i DEV, in particolar modo quando si gestiscono progetti di medie/grandi dimensioni e si lavora in team con 10/15/30 persone differenti, come anche il largo uso di framework e tool di terze parti senza reinventarsi la ruota...
Dai due modi differenti di fare le cose...

Tornando al problema, utilizza quello di marino51,
 
Ultima modifica:

Discussioni simili