2011-12-19 30 views
44

Ho una variabile denominata $final_time_saving che è solo un numero di minuti, 250 per esempio.Convertire il numero di minuti in ore e minuti utilizzando PHP

Come posso convertire tale numero di minuti in ore e minuti con PHP in questo formato:

4 hours 10 minutes

+0

È questo numero il conteggio minuto? 250min! = 4h 17min –

+2

No, ma Googling 250 minuti in ore restituisce 4.16666667 ore, quindi forse è da lì che Rob ha preso la cifra? –

+0

possibile duplicato di [Converti secondi in ore: minuti: secondi] (http://stackoverflow.com/questions/3172332/convert-seconds-to-hourminutesecond) – PeerBr

risposta

84
<?php 

function convertToHoursMins($time, $format = '%02d:%02d') { 
    if ($time < 1) { 
     return; 
    } 
    $hours = floor($time/60); 
    $minutes = ($time % 60); 
    return sprintf($format, $hours, $minutes); 
} 

echo convertToHoursMins(250, '%02d hours %02d minutes'); // should output 4 hours 17 minutes 
+4

Il commento dopo il codice è divertente .. Copiato dalla domanda ... 250 minuti è 4 ore (240 minuti) e 10 minuti, non 17 :) – mavrosxristoforos

+5

Lo è davvero. Non sono sicuro del motivo per cui l'ho scritto!Lasciandolo per i posteri :) –

+1

Sarebbe bello se questo restituisse solo i minuti in ore = 0. –

26
$hours = floor($final_time_saving/60); 
$minutes = $final_time_saving % 60; 
+0

In realtà è la soluzione migliore. senza coinvolgere alcuna funzione di data – Imtiaz

7

risposta di @ Martin Bean è perfettamente corretto, ma dal mio punto di vista ha bisogno di un refactoring per adattarsi a quello che un utente normale si aspetterebbe da un sito Web (sistema Web).
Penso che quando i minuti sono inferiori a 10 deve essere aggiunto uno zero iniziale.
ex: 10:01, non 10: 1

ho cambiato il codice di accettare $time = 0 dal 00:00 è meglio di 24:00.

Un'altra cosa: non ci sono casi in cui $time è più grande di 1439 - che è 23:59 e il valore successivo è semplicemente 0:00.

function convertToHoursMins($time, $format = '%d:%s') { 
    settype($time, 'integer'); 
    if ($time < 0 || $time >= 1440) { 
     return; 
    } 
    $hours = floor($time/60); 
    $minutes = $time%60; 
    if ($minutes < 10) { 
     $minutes = '0' . $minutes; 
    } 
    return sprintf($format, $hours, $minutes); 
} 
+2

Buon punto, concordo sul fatto che i minuti richiedono uno zero iniziale. Un altro modo per farlo sarebbe utilizzare la funzionalità di riempimento di sprintf: 'echo sprintf ('% 02d', 2); // questo echos "02" ' –

+0

uguale ai minuti, l'ho aggiunto per ore, specialmente importante quando si aggiunge al database in modo che mysql non venga confuso –

2

Ci scusiamo per allevare un vecchio argomento, ma ho usato un po 'di codice da una di queste risposte molto, e oggi mi sono detto che potevo farlo senza rubare il codice di qualcuno. Ero sorpreso di quanto fosse facile. Quello che volevo è di 510 minuti per essere restituito alle 08:30, quindi questo è ciò che fa il codice.

function tm($nm, $lZ = true){ //tm = to military (time), lZ = leading zero (if true it returns 510 as 08:30, if false 8:30 
    $mins = $nm % 60; 
    if($mins == 0) $mins = "0$mins"; //adds a zero, so it doesn't return 08:0, but 08:00 

    $hour = floor($nm/60); 

    if($lZ){ 
    if($hour < 10) return "0$hour:$mins"; 
    } 

    return "$hour:$mins"; 
} 

Io uso i nomi delle variabili brevi, perché ho intenzione di utilizzare la funzione di molto, e io sono pigro.

71
echo date('H:i', mktime(0,257)); 
+3

fantastico! così veloce! grazie fratello! – Antonio

+2

migliore sollution! anche, per secondi => data ('H \ hi \ m: s \ s', mktime (0,0, $ totalSeconds)) – mwm

+11

Soluzione sbagliata. Non funziona per periodi> 24 ore e dipende anche dalla configurazione del fuso orario. Non è una * data * con cui stai lavorando, non usare le funzioni 'date'. – deceze

7

È possibile raggiungere questo obiettivo con DateTime estensione, che funzionerà anche per numero di minuti che è più grande di un giorno (>= 1440):

$minutes = 250; 
$zero = new DateTime('@0'); 
$offset = new DateTime('@' . $minutes * 60); 
$diff = $zero->diff($offset); 
echo $diff->format('%a Days, %h Hours, %i Minutes'); 

demo

0
function hour_min($minutes){// Total 
    if($minutes <= 0) return '00 Hours 00 Minutes'; 
else  
    return sprintf("%02d",floor($minutes/60)).' Hours '.sprintf("%02d",str_pad(($minutes % 60), 2, "0", STR_PAD_LEFT)). " Minutes"; 
} 
echo hour_min(250); //Function Call will return value : 04 Hours 10 Minutes 
2
$t = 250; 
$h = floor($t/60) ? floor($t/60) .' hours' : ''; 
$m = $t%60 ? $t%60 .' minutes' : ''; 
echo $h && $m ? $h.' and '.$m : $h.$m; 

4 ore e 10 mi nutes

0

Il modo più semplice è:

gmdate('H:i', $numberOfSeconds * 60) 
1

Solo nel caso in cui si desidera qualcosa di simile:

echo date('G \h\o\u\r\s i \m\i\n\u\t\e\s', mktime(0, 90)); //will return 1 hours 30 minutes 
echo date('G \j\a\m i \m\e\n\i\t', mktime(0, 90)); //will return 1 jam 30 menit 
0
$m = 250; 

$extraIntH = intval($m/60); 

$extraIntHs = ($m/60);    // float value 

$whole = floor($extraIntHs);  // return int value 1 

$fraction = $extraIntHs - $whole; // Total - int = . decimal value 

$extraIntHss = ($fraction*60); 

$TotalHoursAndMinutesString = $extraIntH."h ".$extraIntHss."m"; 
Problemi correlati