使用PHP将分钟数转换为小时和分钟

83

我有一个名为$final_time_saving的变量,它只是一个代表分钟数的数字,例如250。

如何使用PHP将这些分钟数转换为小时和分钟,并以以下格式显示:

4 小时 10 分钟


这个数字是分钟计数吗?250分钟!= 4小时17分钟。 - Eugen Rieck
2
不过,将250分钟转换成小时进行谷歌搜索会得到4.16666667小时,也许这就是Rob得出这个数字的来源? - Martin Bean
可能是将秒转换为小时:分钟:秒的重复问题。 - PeerBr
14个回答

157
<?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

11
代码后面的评论很有趣...从问题中复制...250分钟是4小时(240分钟)和10分钟,而不是17分钟 :) - mavrosxristoforos
10
确实是这样。不确定我为什么写了那个!为了纪念留下它 :) - Martin Bean
1
如果小时数为0时,只返回分钟将会很好。 - tim peterson
可能有所帮助的是将格式更改为'%d:%02d',因为像“6:1”这样的字符串与“6:01”相比没有太多意义。 - user377628
那天数呢? - Oleg Shakhov
显示剩余4条评论

123
echo date('H:i', mktime(0,257));

3
最佳解决方案! 此外,对于秒数 => date('H\hi\m:s\s',mktime(0,0,$totalSeconds)) - mwm
23
错误的解决方案。无法处理超过24小时的时间并且还取决于时区配置。你处理的不是“日期”,所以不要使用date函数。请修正内容,使其更易懂,但不要改变原意。 - deceze
这是一个解决_question_的方案,但你是正确的,@deceze,对于超过24小时的时间段不准确。我不明白这与时区有什么关系,gmmktime会返回本地偏移时间。 - Alastair
5
当您只需要转换一些整数并保持在24小时范围内时,它非常完美! - Daan
6
这是一个误导性的解决方案,至少应该指出它不适用于超过 24 小时。 - Tool
显示剩余3条评论

50
$hours = floor($final_time_saving / 60);
$minutes = $final_time_saving % 60;

13

您可以使用DateTime扩展实现此目的,它还可以用于超过一天的分钟数(>= 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');

演示


如果你的分钟数是像 12.99 这样的形式,这个程序就会出错。 - Ray
2
十进制不是有效的分钟格式。问题是“使用PHP将分钟数转换为小时和分钟”。 - M H

9

@Martin Bean的回答是完全正确的,但在我看来,它需要进行一些重构,以符合普通用户对网站(网络系统)的期望。
我认为当分钟数少于10时,必须添加前导零。
例如:10:01,而不是10:1。

我更改了代码,接受$time = 0,因为0:00比24:00更好。

还有一件事-没有情况下$time大于1439-这是23:59,下一个值就是简单的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);
}

3
好主意,我同意分钟需要加上前导零。另一种方法是使用sprintf的填充功能:echo sprintf('%02d', 2); // 这会输出“02” - Dave Hollingworth
与分钟相同,我将其添加为小时,特别重要的是在添加到数据库时,这样MySQL就不会混淆。 - Dvid Silva
返回值不一致,可能返回void,也可能返回字符串。 - Erlang Parasu

8
$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小时10分钟


5

非常抱歉提及一个旧话题,但我经常使用这些答案中的一些代码,今天我告诉自己可以不用窃取别人的代码来完成它。我很惊讶这是多么容易。我想要的是将510分钟返回为08:30,所以这就是代码的作用。

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";
}

我使用短变量名是因为我会经常使用该函数,而且我很懒。


4
最简单的方法是:
    gmdate('H:i', $numberOfSeconds * 60)

1
gmdate('H:i', 9999 * 60) => "22:39" gmdate('H:i', 99999 * 60) => "10:39"
- Erlang Parasu

3

如果你想要做类似的事情:

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

1
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

很棒的想法,我基于这个概念进行了扩展。感谢分享。 - user670265

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接