You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:54:43