0

オンライン試験用の Joomla コンポーネントを作成していますが、フォーマット変換に苦労しています。基本的に、日付との差(秒単位)を取得してから分に変換したいのですが、何を試しても、オンラインで何を検索しても(SOを含む)、うまく動作しないようです。

次のコードがあります。

<?php
$session =& JFactory::getSession();
$sessionStuff = $session->get('quizSession');

$time_config =& JFactory::getConfig();
$time_jnow =& JFactory::getDate();
$time_jnow->setOffset( $time_config->getValue('config.offset' ));
$time_now = strtotime($time_jnow);
$started_time = strtotime($sessionStuff['lineSession']['started_on']);

$elapsedtime = /*gmdate("H:i:s",*/ abs($started_time - $time_now)/*)*/;
echo "Start_time: " . $started_time . '- Type: ' . gettype($started_time). '<br/>';
echo "Now: " . $time_now . '- Type: ' . gettype($time_now). '<br/>';
echo "Elapsed time: " . $elapsedtime . /*'- Type: ' . gettype($elapsedtime) .*/ '<br/>';

$availabletime = $started_time - $elapsedtime;

if(empty($sessionStuff)){
    $availabletime = ($this->quiz->time_limit) ? $this->quiz->time_limit : 0;
} else {
    $availabletime = $started_time - $elapsedtime;
}

echo "Available: " . $availabletime . '- Type: ' . gettype($availabletime);
?>

次を出力します。

Start_time: 1365756958- タイプ: 整数

現在: 1365757510- タイプ: 整数

経過時間: 552

利用可能: 1365756406- タイプ: 整数

次に、値を (分単位で) 受け取り、正しい形式に変換するこの JS コードがあります。

    var hours ;
    var minutes ; 
    var seconds ;
    var t ;
    var availableTime ;
    var remainingTime ;

window.onload = function () {

    listener();

    availableTime = <?php
                        echo ($this->quiz->time_limit) ? $this->quiz->time_limit : 0;;                       
                    ?> ;
    if (availableTime)
    {
        hours = Math.floor(availableTime / 60) ;
        minutes = availableTime % 60;

        if (hours < 10) {
            hours = '0' + hours ;
        }

        if (minutes < 10) {
            minutes = '0' + minutes ;
        }

        seconds = '00' ;

        var timer = document.getElementById('timer') ;
        timer.innerHTML = '<?php echo JText::_('TIME_REMAINING') ; ?> ' + hours + ":" + minutes + ":" + seconds ;

        remainingTime = availableTime *= 60 ;

        updateTimer();
    }
}

function pad(number, length) 
{
    var str = '' + number;
    if (str.length < length) {
        str = '0' + str;
    }

    return str;
}

function updateTimer()
{
    seconds -= 1 ;
    seconds = pad(seconds, 2) ;

    if (seconds < 0)
    {
        seconds = '59' ;
        minutes -= 1 ;
        minutes = pad(minutes, 2) ;

        if (minutes < 0)
        {
            minutes = '59' ;
            hours -= 1 ;
            hours = pad(hours, 2) ;

            if (hours < 0)
            {
                hours = minutes = seconds = '00' ;
                document.getElementById('timeUp').value = 1 ;
                document.jquarks_quiz.submit();
                return true ;
            }
        }
    }

    var timer = document.getElementById('timer') ;
    timer.innerHTML = '<?php echo JText::_('TIME_REMAINING') ; ?> ' + hours + ':' + minutes + ':' + seconds ;

    remainingTime -= 1 ;
    if (Math.floor(availableTime / 10) == remainingTime ) 
    {
        timer.style.color="white" ;
        timer.style.backgroundColor = "#DD0000" ;
    }

    t = setTimeout("updateTimer()", 1000);
}

このコードに「ネイティブ」形式 (PHP) を使用すると、次のようになります。

$time_now = $time_jnow;
$started_time = $sessionStuff['lineSession']['started_on'];

出力が得られます:

Start_time: 2013-04-12 09:55:58- タイプ: 文字列

現在: 2013-04-12 10:23:20- タイプ: オブジェクト

さて、私が意図しているのは、「started_time」と「time_now」の時間差を計算し、(ページの更新でセッションが設定されている場合)「elapsedtime」を「started_time」から差し引いて、タイムアウトカウンターがから継続するようにすることです中断したところ。

何をしようとしても、物事を正しく機能させることができないようです。誰かが私を正しい方向に向けることができますか? 私はすでにこれであまりにも多くの時間を失っており、PHP は私の得意分野ではありませ。どうすれば意図した目標を達成できますか?

編集:

JS の「availableTime」が一定の時間を取得していることは認識していますが、それは今のところデバッグ目的のためだけです。すべてが正常に機能するようになると、PHP の「$availabletime」出力が提供されます。

編集2:

目的が何であるかについては明確にされていないようです。試験が開始されたら、15 分間の時間があるとします。ユーザーが 1 分 31 秒 (00:01:31) 後にページを更新したと仮定すると、利用可能な時間は 13 分 29 秒 (00:13:29) になるはずです。これは、経過時間 (秒単位) の計算を実行できますが、達成できない動作です。

4

1 に答える 1

1

これは本当に簡単な方法です。

 // Define your time strings
 $date1 = new DateTime("2013-01-01 07:00:00");
 $date2 = new DateTime("2014-01-01 03:17:00");

 // Perform a bit of black hoodoo magic
 $interval = $date1->diff($date2,true);

 // Output the result in a formatted fashion
 echo $interval->format("%d days %h hours %i minutes %s seconds");
 // Or as a number of seconds. This is a bit more complicated.
 echo (($interval->y * 365 * 24 * 60 * 60) + 
           ($interval->m * 30 * 24 * 60 * 60) + 
           ($interval->d * 24 * 60 * 60) + 
           ($interval->h * 60 * 60) + 
           ($interval->i * 60) + 
           $interval->s); 
 // For more info, check this out along with the doc:
 var_dump($interval);

これにより、実行中のすべての計算を抽象化して、ロジックに集中することができます。何がうまくいかないのですか?

于 2013-04-12T10:47:36.327 に答える