我正在为在线考试构建一个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-类型:integer
现在: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);
}
如果我在这段代码中使用"native"格式(在PHP中):
$time_now = $time_jnow;
$started_time = $sessionStuff['lineSession']['started_on'];
我得到了输出:
Start_time: 2013-04-12 09:55:58- Type: string
现在:2013-04-12 10:23:20-类型:对象
现在,我打算计算' start_time '和'time_now'之间的时间差,并且(如果是页面刷新和会话设置)减去'elapsedtime'到'started_time',以便超时计数器将从它离开的地方继续。
不管我怎么努力,我似乎都不能使事情正常工作。谁能给我指个正确的方向?我已经在这上面浪费了太多时间,PHP不是我的强项。我怎样才能达到预期的目标?
编辑:我意识到JS 'availableTime'正在获得一个常数时间,但这只是为了调试的目的。一旦一切正常工作,它将被输入PHP '$availabletime'输出。
编辑2:
我似乎没有明确说明目标是什么。一旦考试开始,假设有15分钟的空闲时间。假设用户在1分31秒(00:01:31)后刷新页面,则可用时间应为13分29秒(00:13:29)。这是我无法实现的行为,尽管我可以执行计算已经过了多少时间(以秒为单位)。
这是一个非常简单的方法。
// 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);
这允许你抽象掉你正在做的所有计算,以便专注于逻辑。出了什么问题?