[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
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
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:

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
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:

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
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:

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
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
Autore Titolo Forum Risposte Data
M [PHP] Calcoli con ore formato 00:00:00 PHP 7
C Calcoli matematici in php PHP 5
B Fare calcoli con php da tabella mysql PHP 2
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10

Discussioni simili