我正在为在线考试构建一个 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)。这是我无法实现的行为,尽管我可以计算已经过去了多少时间(以秒为单位)。