2010-08-12 60 views
1

我取出由MYSQL日期时间,它看起来像:舍入MYSQL日期时间到最早每隔15分钟以毫秒为单位(PHP)

2010-08-11十一时18分28秒

我需要将其转换为“楼层”或最早的15分钟间隔,并以毫秒为单位输出另一个功能。

所以,这种情况下应该是:

2010-08-11 11:15:00毫秒


哎呦!对不起 - 需要澄清 - 我需要将代码转换为毫秒内的代码!


做一个定时测试揭示了以下内容:采取

$time_start = microtime(true); 
for($i=0;$i<10000;$i++) 
    floor(strtotime('2010-08-11 23:59:59')/(60*15))*60*15*1000; 
$time_end = microtime(true); 
echo 'time taken = '.($time_end - $time_start); 

时间= 21.440743207932

$time_start = microtime(true); 
for($i=0;$i<10000;$i++) 
    strtotime('2010-08-11 23:59:59')-(strtotime('2010-08-11 23:59:59') % 900); 
$time_end = microtime(true); 
echo 'time taken = '.($time_end - $time_start); 

时间采取= 39.597450017929

$time_start = microtime(true); 
for($i=0;$i<10000;$i++) 
    bcmul((strtotime('2010-08-11 23:59:59')-(strtotime('2010-08-11 23:59:59') % 900)), 1000); 
$time_end = microtime(true); 
echo 'time taken = '.($time_end - $time_start); 

时间采取= 42.297260046005

$time_start = microtime(true); 
for($i=0;$i<10000;$i++) 
    floor(strtotime('2010-08-11 23:59:59')/(900))*900000; 
$time_end = microtime(true); 
echo 'time taken = '.($time_end - $time_start); 

时间采取采取= 20.687357902527

时间= 19.32729101181

时间采取= 19.938629150391

它似乎是strtotime()函数是一个缓慢的,我们应该避免每次需要时双倍使用它。 !该timetaken(60 * 15)= timetaken(900)是一个惊喜的一点点...

回答

1

将这项工作?没有一些功能可以做得更好吗?

echo floor(strtotime('2010-08-11 11:18:28')/(60*15))*60*15*1000; 
1281505500000 
Wednesday, August 11, 2010 11:15:00 AM 

echo floor(strtotime('2010-08-11 11:28:28')/(60*15))*60*15*1000; 
1281505500000 
Wednesday, August 11, 2010 11:15:00 AM 

echo floor(strtotime('2010-08-11 00:00:00')/(60*15))*60*15*1000; 
1281465000000 
Wednesday, August 11, 2010 12:00:00 AM 

echo floor(strtotime('2010-08-11 23:59:59')/(60*15))*60*15*1000; 
1281550500000 
Wednesday, August 11, 2010 11:45:00 PM 
0

试试这个,看看会发生什么:

select DATE(myColumn) 
     + CONVERT(HOUR(myColumn),CHAR(2)) + ':' 
     + CASE 
     WHEN MINUTE(myColumn) < 15 THEN '00' 
     WHEN MINUTE(myColumn) < 30 THEN '15' 
     WHEN MINUTE(myColumn) < 45 THEN '30' 
     ELSE '45' 
     END 
     + ':00' as myDate 
0

好吧,让我们来看看最糟糕的解决方案:

<?php 

$ts = explode(' ', '2010-08-11 11:18:28'); 
$date = explode('-', $ts[0]); 
$time = explode(':', $ts[1]); 
$ts = mktime($time[0], $time[1], $time[2], $date[1], $date[2], $date[0]); 
$floor = mktime($time[0], round($time[1]/15)*15, 0, $date[1], $date[2], $date[0]); 
1

下面将给你最早15分钟间隔:

select UNIX_TIMESTAMP(YOURDATETIME)-MOD(UNIX_TIMESTAMP(YOURDATETIME), 900) 
from YOURTABLE 

结果是划时代秒(S自从'1970-01-01 00:00:00'UTC以来的秒数),如果你想要以毫秒为单位的值,你应该乘以1000(无论是在查询还是在PHP中,如你所见)。

编辑

在PHP为您的一组值,这将是:

$values = array('2010-08-11 11:18:28', '2010-08-11 11:28:28', '2010-08-11 00:00:00', '2010-08-11 23:59:59'); 
foreach($values as $value) { 
    $result = (strtotime($value)-(strtotime($value) % 900)); 
    echo "$value -> $result\n"; 
} 

当你乘以1000 $结果(以获得以毫秒的值),你可能会得到溢出结果将被转换为浮点数。这可能不是你想要的,所以你可能会使用bcmul的更好:

$result = bcmul((strtotime($value)-(strtotime($value) % 900)), 1000); 
+0

嗨!这看起来像MySQL的rad,是否有像这样在php中做同样的聪明方式? – DrMHC 2010-08-12 17:06:17

+0

当然,看看我的编辑。 – wimvds 2010-08-13 07:26:56

相关问题