2015-05-14 76 views
1

我在这里有一个mysql查询,获取列的平均值(列数据类型是'时间')。例如,该列值: 00:00:55,00:00:59,0时01分03秒Php时间格式

SELECT AVG(TIME_TO_SEC(column_name)) FROM table_name)AS average_result 

在我的PHP我格式化的结果是这样的:

<?php foreach($display_average as $da){ 
    echo date("H:i:s", ($da["average_result"])); 
} 
?> 

输出:08:00:59而不是00:00:59,为什么这从08开始?或者我错过了什么?谢谢!

回答

1

看到php manul,有关date_default_timezone_set你的时区为+8

默认PHP的date.timezone是UTC,U可以将其更改为date.timezone = PRC

date_default_timezone_set('UTC'); 
echo date("H:i:s", 59);//00:00:59 

//date_default_timezone_set('RPC'); 
//echo date("H:i:s", 59);//08:00:59 
+0

其实我使用Codeigniter作为我的框架,所以我应该如何做到这一点? – Kentot

+1

date_default_timezone_set('UTC'); //在你打电话之前date() – islq

+0

明白了吧!非常感谢 !我只是将它添加到我最外面的index.php文件中,以便在整个项目中全局可用。 – Kentot

2

两个PHP的日期/时间函数和MySQL的日期/时间数据类型句柄挂钟时间戳,而不是持续时间;即00:00:55表示午夜五十五秒。这不是你想要的;您无法处理持续时间超过23小时59分59秒,因为您使用的数据类型和功能处理的时钟时间不能超过这些值。

您的特定问题源于时区设置。你更大的问题是你需要存储简单的整数值表示经过的秒或分钟;不是时间戳。要在PHP中将其格式化为可读取的字符串,您可以使用DateInterval class

0

总是去标准/正式的方法。但是,如果您需要定制它,那么您可以通过编程完成几乎所有的事情。在这里,我们去

让您的时间,人数从数据库(在你的时间申请秒数)为

SELECT 
AVG 
(
    HOUR(column_name) * 3600 
    + MINUTE(column_name) * 60 
    + SECOND(column_name) 
) AS numeric_average_result FROM table_name 

现在你可以秒数转换为正确的时间

foreach($display_average as $da) 
{ 
    $r = numToTime($da["numeric_average_result"]); 
    echo "<br>".$r; 
} 


function numToTime($num) 
{ 
    $seconds = $num%60; 
    $num = (int)($num/60); 
    $minutes = $num%60; 
    $hours = (int)($num/60); 
    return make2digit($hours).":".make2digit($minutes).":".make2digit($seconds); 
} 

function make2digit($val) 
{ 
    if(strlen($val) == 1) 
     return "0".$val; 
    else 
     return $val; 
}