如何以小时数、数周数月数 PHP 的形式获取分钟数



我正在努力实现这一目标,但结果不是我想要的。使用随机分钟值(应生成年:月:周:天:小时:分钟(时,结果值错误,冒号不在正确的位置,例如1500,2800 .etc

我想将分钟转换为相应的年份 : 月 : 周 : 天 : 小时 : 分钟

我试过什么?

$minutesConverter = function($from,$to,$format='dynamic'){
    $year    = floor($from/525600)    ? floor($from/525600)     : '';
    $Rminutes= $from%525600;
    $month   = floor($Rminutes/43800.048)  ? floor($Rminutes/43800.048)  : '';
    $Rminutes= $from%43800.048;
    $week    = floor($Rminutes/10080)     ? floor($Rminutes/10080)     : '';
    $Rminutes= $from%10080;
    $day     = floor($Rminutes/1440)      ? floor($Rminutes/1440)      : '';
    $Rminutes= $from%1440;
    $hour    = floor($Rminutes/60)        ? floor($Rminutes/60)            : '';
    $minute  = $from%60               ? $from%60               : '';            
    if(!empty($year)  ){ if($year   > 1 ){ $year    = $year.' years';     }else{ $year   = $year.' year';     }  }
    if(!empty($month) ){ if($month  > 1 ){ $month   = $month.' months';   }else{ $month  = $month.' month';   }  }
    if(!empty($week)  ){ if($week   > 1 ){ $week    = $week.' weeks';     }else{ $week   = $week.' week';     }  }
    if(!empty($day)   ){ if($day    > 1 ){ $day     = $day.' days';       }else{ $day    = $day.' day';       }  }
    if(!empty($hour) ){ if($hour    > 1 ){ $hour    = $hour.' hours';     }else{ $hour   = $hour.' hour';     }  }
    if(!empty($minute)){ if($minute > 1 ){ $minute  = $minute.' minutes'; }else{ $minute = $minute.' minute'; }  }  
    if(!empty($year))  { $year   = $year;   }
    if(!empty($month)) { if(empty($year)){ $month  = $month; }else{ $month  = ' : '.$month; } }
    if(!empty($week)) { if(empty($month)){ $week  = $week; }else{ $week  = ' : '.$week; } }
    if(!empty($day)) { if(empty($week)){ $day  = $day; }else{ $day  = ' : '.$day; } }
    if(!empty($hour)) { if(empty($day)){ $hour  = $hour; }else{ $hour  = ' : '.$hour; } }
    if(!empty($minute)) { if(empty($hour)){ $minute  = $minute; }else{ $minute  = ' : '.$minute; } }
    
    return $year.$month.$week.$day.$hour.$minute;
};

例:

对于使用分钟值为 131400 即,e 3 个月(根据谷歌计算器( 但是它的输出是:

2 个月6 小时

问题?

  1. 无冒号

  2. 错误的可读时间

需要帮助!请看一看。

代码的主要问题是,您应该在每次传递时从$from中减去周期数乘以周期长度,而不是将$from的模数与周期长度相乘。这是因为并非所有月经都是所有较小月经的倍数(例如,1 个月不是周的精确倍数(。代码也可以通过使用句点数组来显着简化,例如:

$minutesConverter = function($from) {
    if (!$from) return '0 minutes';
    $periods = array('year' => 525600,
                     'month' => 43800,
                     'week' => 10080,
                     'day' => 1440,
                     'hour' => 60,
                     'minute' => 1);
    $output = array();
    foreach ($periods as $period_name => $period) {
        $num_periods = floor($from / $period);
        if ($num_periods > 1) {
            $output[] = "$num_periods {$period_name}s";
        }
        elseif ($num_periods > 0) {
            $output[] = "$num_periods {$period_name}";
        }
        $from -= $num_periods * $period;
    }
    return implode(' : ', $output);
};
echo $minutesConverter(131390, 0);

输出:

2 months : 4 weeks : 2 days : 9 hours : 50 minutes

3v4l.org 演示

不是对你的问题的直接回答,但也许是一个想法和一个模板。

几年前我也有类似的问题。我想显示一个持续时间(过去的时间戳(作为相对时间。所以我在下面创建了函数,并具有以下先决条件:

  • 短格式。
  • 固定字段宽度(6+分隔符(。
  • 没有月份,因为月份的长度变化太大。
  • 单位是秒、分钟、小时、天、周和年的缩写。
  • 支持德语和英语缩写。
  • 将输出限制为 2 个单位。更多对读者没有帮助。
  • 2 个单元之间的选项分隔符。

这是我的函数:

function GetAge6 ( $sec, $sep = '' )
{
    if ( $sec < 60 )
        return sprintf('   %s%2us',$sep,$sec);
    $min = floor($sec/60);
    if ( $min < 60 )
        return sprintf('%2um%s%02us',$min,$sep,$sec%60);
    $hour = floor($min/60);
    if ( $hour < 48 )
        return sprintf('%2uh%s%02um',$hour,$sep,$min%60);
    $day = floor($hour/24);
    if ( $day < 28 )
        return sprintf('%2ud%s%02uh',$day,$sep,$hour%24);
    $week = floor($day/7);
    if ( $week < 52 )
        return sprintf('%2uw%s%2ud',$week,$sep,$day%7);
    $year = floor($day/365);
    if ( $year < 100 )
    {
        $week = floor( ( $day - $year*365 ) / 7 );
        return sprintf('%2u%s%s%02uw',
                $year, DCLIB_LANGUAGE=='de' ? 'j' : 'y', $sep, $week );
    }
    if ( $year < 1000000 )
        return sprintf('%s%6u%s',
                str_repeat(' ',strlen($sep)),
                $year, DCLIB_LANGUAGE=='de' ? 'j' : 'y' );
    return sprintf('***%s***',$sep);
}

这里有一个例子:https://wiimmfi.de/stats/login/ext#hour请参阅第 average online duration 列和悬停文本。

如果您使用作曲家(https://getcomposer.org(,我建议您使用Carbon包来表示日期等。也许你和其他人会觉得这很有趣:

https://carbon.nesbot.com/docs/#api-difference

它对人类也有区别,如果你想要这样的东西:"1 小时前"。

https://carbon.nesbot.com/docs/#api-humandiff

这也是Laravel框架使用的软件包,非常棒。但是,如果你想学习新东西,我肯定会在计算之前将所有内容转换为秒数,并从最高金额开始,依此类推。

最新更新