javascript - 同一套实现原理,js实现 和 php 实现,其运算结果差距很大,郁闷??
伊谢尔伦
伊谢尔伦 2017-04-11 13:01:12
0
1
283

以下两种实现用的是相同的逻辑,我先写的 js 的函数,然后用 php 翻译下,变成 php 版本 的。都是根据给定的 秒数 格式化成易于理解的形式。

先看结果哈:

  1. 秒数为 180

  2. 秒数为 454556

  3. 秒数为 4546456464

给的数小的时候没有问题,给的数大的时候,由于可能会出现除不尽的情况,jsphp 居然会相差那么多,这个问题怎么破??

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伐。

全員に返信(1)
巴扎黑


我的php表示很正常。。。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!