以下两种实现用的是相同的逻辑,我先写的 js
的函数,然后用 php
翻译下,变成 php 版本
的。都是根据给定的 秒数
格式化成易于理解的形式。
先看结果哈:
秒数为 180
:
秒数为 454556
秒数为 4546456464
:
给的数小的时候没有问题,给的数大的时候,由于可能会出现除不尽的情况,js
和 php
居然会相差那么多,这个问题怎么破??
Js 实现
/*
* 根据给定的时间长度转化为预定义格式的时间
* @param Number duration 时长
* @param String format 返回的时间格式
* @param Boolean isZeroAdd 分以上值为 0 是否需要严格按照格式进行返回,是 值为0的也会自动填充,否则不会
* @return Mixed
*/
SmallJs.formatTime = function(duration , format , isZeroAdd){
var formatRange = ['D天H时I分S秒' , 'HH:II:SS' , 'json'];
var format = !SmallJs.contain(format , formatRange) ? 'D天H时I分S秒' : format;
var isZeroAdd = SmallJs.getValType(isZeroAdd) !== 'Boolean' ? true : isZeroAdd;
var sRatio = 1;
var iRatio = 60;
var hRatio = 60 * 60;
var dRatio = 24 * 60 * 60;
var getTime = function(time , ratio , stepRatio){
time = Math.floor(time / ratio);
while (time >= stepRatio)
{
time %= stepRatio;
}
return time;
};
var s = getTime(duration , sRatio , 60);
var i = getTime(duration , iRatio , 60);
var h = getTime(duration , hRatio , 24);
var d = Math.floor(duration / dRatio);
if (format === 'D天H时I分S秒') {
return d + '天' + h + '时' + i + '分' + s + '秒'
}
if (format === 'HH:II:SS') {
if (isZeroAdd) {
if (h < 10) {
h = '0' + h;
}
h += ':';
if (i < 10) {
i = '0' + i;
}
i+= ':';
if (s < 10) {
s = '0' + s;
}
return h + i + s
} else {
d = d === 0 ? '' : d + ':';
h = h === 0 ? '' : h + ':';
if (i < 10) {
i = '0' + i;
}
i += ':';
if (s < 10) {
s = '0' + s;
}
return d + h + i + s;
}
}
if (format === 'json') {
return {
day: d ,
hour: h ,
minute: i ,
second: s
};
}
};
PHP 实现
/*
* 根据给定的时间长度转化为预定义格式的时间
* @param Number $duration 时长
* @param String $format 返回的时间格式
* @param Boolean $isZeroAdd 分以上值为 0 是否需要严格按照格式进行返回,是 值为0的也会自动填充,否则不会
* @return Mixed
*/
function format_time($duration = 0 , $format = 'D天H时I分S秒' , $isZeroAdd = true){
$formatRange = array('D天H时I分S秒' , 'HH:II:SS' , 'json');
$format = !is_int(array_search($format , $formatRange)) ? 'D天H时I分S秒' : $format;
$isZeroAdd = !is_bool($isZeroAdd) ? true : $isZeroAdd;
$sRatio = 1;
$iRatio = 60;
$hRatio = 60 * 60;
$dRatio = 24 * 60 * 60;
$getTime = function($time , $ratio , $stepRatio){
$time = floor($time / $ratio);
while ($time >= $stepRatio)
{
$time %= $stepRatio;
}
return $time;
};
$s = $getTime($duration , $sRatio , 60);
$i = $getTime($duration , $iRatio , 60);
$h = $getTime($duration , $hRatio , 24);
$d = floor($duration / $dRatio);
if ($format === 'D天H时I分S秒') {
return $d . '天' . $h . '时' . $i . '分' . $s . '秒';
}
if ($format === 'HH:II:SS') {
if ($isZeroAdd) {
if ($h < 10) {
$h = '0' . $h;
}
$h .= ':';
if ($i < 10) {
$i = '0' . $i;
}
$i.= ':';
if ($s < 10) {
$s = '0' . $s;
}
return $h . $i . $s;
} else {
$d = $d === 0 ? '' : $d . ':';
$h = $h === 0 ? '' : $h . ':';
if ($i < 10) {
$i = '0' . $i;
}
$i .= ':';
if ($s < 10) {
$s = '0' . $s;
}
return $d . $h . $i . $s;
}
}
if ($format === 'json') {
return array(
'day' => $d ,
'hour' => $h ,
'minute' => $i ,
'second' => $s
);
}
}
我的php表示很正常。。。