需要php优化:日期范围 - >个月

时间:2010-11-04 20:08:00

标签: php optimization date-range

(现在修好并正常工作,但如果有人还想重构,请留言)

这是我所拥有的函数的精简版本,它迭代日期范围并为每个函数分配一个唯一的整数...

<击> 使用大型数据集时,在不同的日期范围内多次运行,我收到一个致命错误,为脚本分配了太多内存并且在此循环中死了......

<击> Fatal error: Allowed memory size of 268435456 bytes exhausted

已修复,这是迭代的一个问题,没有考虑潜在的夏令时

所以,我想知道是否有人可以推荐一种更优化的方式来生成这个月份/整数列表......

它必须允许我以任何我喜欢的数字启动Int和

<?php
// updated: 2010.11.04 with Qwerty's recommendations 
//  for fixing daylight savings time issue
function monthIterate($monthInt, $startDate, $stopDate) {
    $epoch = $startMain = strtotime($startDate);
    $stopMain = strtotime($stopDate);
    while ($epoch <= $stopMain) {
        // get the start/stop dates for "this month"
        $start = date("Y-m-01", $epoch);
        $stop = date("Y-m-t", $epoch);
        // uniqueID for the month
        $monthKey = "Month#-".str_pad($monthInt, 3, "0", STR_PAD_LEFT);
        $months[$monthKey] = compact('start', 'stop');
        // move forward in loop, +1 day should get us to the next month
        $epoch = strtotime($stop);
        $currentMonth = $nextMonth = date('m', $epoch);
        while ($currentMonth == $nextMonth) {
            $epoch = $epoch + 86400;
            $nextMonth = date('m', $epoch);
        }
        $monthInt++;
    }
    return $months; 
}
?>

2 个答案:

答案 0 :(得分:2)

看起来你的功能无限循环,因为节省了一些时间。

echo date('Y-m-d H:i:s', strtotime('2010-10-31') + 60*60*2); // adding 2 hours
echo date('Y-m-d H:i:s', strtotime('2010-10-31') + 60*60*3); // adding 3 hours

两者都会输出2010-10-31 02:00:00。因此strtotime('2010-10-31') + 86400实际上是2010-10-31 23:00:00,但不是第二天。

因此,您应该添加超过86400秒,以确保切换到第二天: - )

答案 1 :(得分:0)

我认为你的数组索引太疯狂了。

即:

[Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-Month#-123] => Array
(
    [start] => 2011-12-01
    [stop] => 2011-12-31
)

我会移动你的“$ monthInt =”月# - “。str_pad($ monthInt,3,”0“,STR_PAD_LEFT);”循环外的线。

<?php
function monthIterate($monthInt, $startDate, $stopDate) {

$monthInt = "Month#-".str_pad($monthInt, 3, "0", STR_PAD_LEFT); <--

$epoch = $startMain = strtotime($startDate);
$stopMain = strtotime($stopDate);
while ($epoch <= $stopMain) {
    // get the start/stop dates for "this month"
    $start = date("Y-m-01", $epoch);
    $stop = date("Y-m-t", $epoch);
    // uniqueID for the month
    $months[$monthInt] = compact('start', 'stop');
    // move forward in loop, +1 day should get us to the next month
    $epoch = strtotime($stop) + 86400;
    $monthInt++;
}
return $months; 
}?>