2011-12-28 22 views
1

7500秒から数分に変換してから数分に変換しようとしています。この例のように2時間5分になると、「2時間5分」と表示したいと思います。その2時間もあれば、「2時間」を表示するだけです。パーセント記号演算子(%)を使用した場合のトラブル(PHP)

7500を60で割った値を6083で割った値が2.083(3回繰り返される)になります。 なぜ%は0を返しますか?その時間が正確かどうか、または表示する時間があればどうすればいいですか?

+1

いつもゼロが得られます。パーセント記号は何を知っていますか? –

+3

モジュラス '% 'のオペランドは、処理の前に整数に変換されます(小数点以下を切り捨てることにより)。あなたの計算は「2%1」となり、結果は0になります(2つの1を2に収めることができます)http://php.net/manual/en/language.operators.arithmetic.php – Fenton

答えて

3

は、使用することができます:MOD(%)はオペレータの動作方法です

function secondsToWords($seconds) 
{ 
    /*** return value ***/ 
    $ret = ""; 

    /*** get the hours ***/ 
    $hours = intval(intval($seconds)/3600); 
    if($hours > 0) 
    { 
     $ret .= "$hours hours "; 
    } 
    /*** get the minutes ***/ 
    $minutes = bcmod((intval($seconds)/60),60); 
    if($hours > 0 || $minutes > 0) 
    { 
     $ret .= "$minutes minutes "; 
    } 

    /*** get the seconds ***/ 
    $seconds = bcmod(intval($seconds),60); 
    $ret .= "$seconds seconds"; 

    return $ret; 
} 
echo secondsToWords(7500); 
+1

ちょうどニット・ピックですが、時間単位を正しく複数化するために、少し論理的な関数を出力に追加したいことがあります: 'function unit ($ amount == 1)? '': 's')); } –

0

これは除算の残りの部分を与えるモジュラス演算子であるためです。

除算演算子/を使用して浮動小数点数を返します。 here

0

少し前に素晴らしい機能を作成しました。あなたが望むなら、それはまた何年も何ヶ月も(あなたが望むものは何でも)行います。

出典+例:http://hotblocks.nl/tests/time_ago.php

機能:変換のために

<?php 
function time_ago($f_seconds, $f_size = 2, $f_factor = 1.6) { 
    $units = array(
     86400*365.25 => array(' year', ' years'), 
     86400*30 => array(' month', ' months'), 
     86400*7 => array(' week', ' weeks'), 
     86400 => array(' day', ' days'), 
     3600 => array(' hour', ' hours'), 
     60 => array(' minute', ' minutes'), 
     1 => array(' second', ' seconds'), 
    ); 

    if (isset($GLOBALS['g_units']) && is_array($GLOBALS['g_units'])) { 
     $units = $GLOBALS['g_units']; 
    } 

    $timeAgo = array(); 

    $seconds = (int)$f_seconds; 
    foreach ($units AS $range => $unit) { 
     if (1 == $range || $seconds >= $range * $f_factor) { 
      is_array($unit) || $unit = array($unit, $unit); 

      $last = count($timeAgo) == $f_size-1; 
      $round = $last ? 'round' : 'floor'; 

      $num = $round($seconds/$range); 
      $timeAgo[] = $num . $unit[(int)(1 != $num)]; 

      if ($last) { 
       break; 
      } 

      $seconds -= $num * $range; 
     } 
    } 

    $separator = isset($GLOBALS['g_separator']) ? $GLOBALS['g_separator'] : ', '; 
    return implode($separator, $timeAgo); 
} 
?> 
+0

Nitpick:A年は365.25日ではありません。 2011年1月1日の真夜中と2012年1月1日の深夜はちょうど1年離れていますが、365.25日の1年間は(1年から6時間)離れています。同様に、1か月は30日ではなく、2011年1月1日から2012年1月1日の間の差は12ヶ月と5〜6日ではなく12ヶ月です。 – cHao

+0

私にとっては十分です。 – Rudie

+0

あなたのサイトを訪れ、2011年1月1日と1月1日が2012年1月1日が「1年」ではなく「12ヶ月5日」であるとみなされる人には十分ではありません。もし私がそれを見たなら、誰でもそれを作った人の意見はかなり低いだろう。あなたが本当に大きな範囲を必要としない限り、それを完全にスキップすることをお勧めします。もしそうなら、あなたは数秒でそれをベースにするべきではありません。 – cHao

-1

を。すべての整数は1で割り切れるので、すべての整数nについて、 n%1 = 0

です。

%演算子で何をしようとしていますか?

何でも、秒数のような整数値で適用したいと思うかもしれません。整数でない値に対しては機能しません。オペレータが適用される前にint値に昇格されます。

関連する問題