PHP实现分钟转年:月:周:日:时:分功能遇问题求助
修复分钟转年:月:周:日:时:分的功能问题
我帮你梳理下代码里的核心问题,然后给出修复后的版本:
代码里的关键错误
- 余数计算逻辑错误:每次计算完一个时间单位后,你误用了原始的
$from来计算剩余分钟数,而不是用前一步剩下的$Rminutes。比如计算月份后,$Rminutes = $from%43800.048应该改成$Rminutes = $Rminutes%43800.048,这是导致数值错误的根本原因。 - 冒号拼接逻辑混乱:当前逐个判断拼接的方式很容易出现无冒号或冒号位置错误的问题,比如当某个中间单位为空时,拼接逻辑就会出错。
- 分钟计算错误:最后计算分钟时,你用了
$from%60,应该用最后剩余的$Rminutes,因为前面已经扣除了年、月等单位的分钟数。
修复后的代码
$minutesConverter = function($from, $to, $format='dynamic'){ // 定义各时间单位对应的分钟数(采用平均数值,如需更精确可调整) $units = [ 'year' => 525600, 'month' => 43800, // 按平均每月30天计算,也可以用43829.095更精确 'week' => 10080, 'day' => 1440, 'hour' => 60 ]; $remaining = $from; $resultParts = []; // 遍历计算每个时间单位 foreach($units as $unitName => $minutesPerUnit){ $value = floor($remaining / $minutesPerUnit); if($value > 0){ // 处理单复数 $label = $value > 1 ? $unitName.'s' : $unitName; $resultParts[] = "$value $label"; // 更新剩余分钟数 $remaining = $remaining % $minutesPerUnit; } } // 处理最后剩余的分钟 if($remaining > 0){ $label = $remaining > 1 ? 'minutes' : 'minute'; $resultParts[] = "$remaining $label"; } // 用冒号连接所有非空部分 return implode(' : ', $resultParts); };
测试验证
- 输入
131400分钟:$minutesConverter(131400, '')会输出3 months,和谷歌计算器的结果一致。 - 输入
1500分钟:输出为1 day : 1 hour(1500分钟=25小时=1天1小时)。 - 输入
2800分钟:输出为1 day : 22 hours : 40 minutes。
额外说明
如果需要更精确的月份计算,可以把month对应的分钟数改成43829.095(按平年平均每月的分钟数),不过日常使用中43800(30天)已经足够。
内容的提问来源于stack exchange,提问作者MR_AMDEV
相关产品推荐
相关产品推荐

