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);
?>

输出以下内容:

开始时间: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'];

我得到输出:

开始时间: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 回答