如何以小时天周月年的形式获取分钟 PHP
How to get minutes in the form of hours days weeks months years PHP
我正在努力实现这一点,但结果并不是我想要的 get.The 结果值是错误的,使用随机分钟值时冒号不在正确的位置(应该生成年 : 月 : 周 : 日 : 小时 : 分钟 ) 来自 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 i,e 3 个月(根据 google 计算器)但是输出是:
2 months6 hours
有问题吗?
No colons
Wrong Readable time
需要帮助!请看一下。
不是您问题的直接答案,但可能是一个想法和模板。
几年前我遇到过类似的问题。我想显示一个持续时间(过去的时间戳)作为相对时间。所以我创建了下面的函数并满足了以下先决条件:
- 短格式。
- 固定字段宽度(6+strlen(分隔符))。
- 没有月份,因为月份的长度变化太大。
- 单位是秒、分、时、日、周、年的缩写。
- 支持德语和英语缩写。
- 将输出限制为 2 个单位。再多也无济于事 reader.
- 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
和悬停文本。
您的代码的主要问题是您应该在每次传递时从 $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
如果您使用 composer (https://getcomposer.org),我建议您使用 Carbon 包来处理日期等。也许您和其他人会觉得这很有趣:
https://carbon.nesbot.com/docs/#api-difference
它对人类也有不同,如果你想要这样的东西:“1 小时前”。
https://carbon.nesbot.com/docs/#api-humandiff
这也是 Laravel 框架使用的包,非常棒。但是如果你想学习新的东西,我肯定会在计算之前把所有的都转换成秒,然后从最高的开始等等。
我正在努力实现这一点,但结果并不是我想要的 get.The 结果值是错误的,使用随机分钟值时冒号不在正确的位置(应该生成年 : 月 : 周 : 日 : 小时 : 分钟 ) 来自 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 i,e 3 个月(根据 google 计算器)但是输出是:
2 months6 hours
有问题吗?
No colons
Wrong Readable time
需要帮助!请看一下。
不是您问题的直接答案,但可能是一个想法和模板。
几年前我遇到过类似的问题。我想显示一个持续时间(过去的时间戳)作为相对时间。所以我创建了下面的函数并满足了以下先决条件:
- 短格式。
- 固定字段宽度(6+strlen(分隔符))。
- 没有月份,因为月份的长度变化太大。
- 单位是秒、分、时、日、周、年的缩写。
- 支持德语和英语缩写。
- 将输出限制为 2 个单位。再多也无济于事 reader.
- 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
和悬停文本。
您的代码的主要问题是您应该在每次传递时从 $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
如果您使用 composer (https://getcomposer.org),我建议您使用 Carbon 包来处理日期等。也许您和其他人会觉得这很有趣:
https://carbon.nesbot.com/docs/#api-difference
它对人类也有不同,如果你想要这样的东西:“1 小时前”。
https://carbon.nesbot.com/docs/#api-humandiff
这也是 Laravel 框架使用的包,非常棒。但是如果你想学习新的东西,我肯定会在计算之前把所有的都转换成秒,然后从最高的开始等等。