计算两个连续日期之间的最大天数

时间:2009-11-29 05:20:17

标签: php mysql

如果您有一系列ISO日期,您如何计算阵列中两个连续日期之间的最多天数?

$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');

我认为我需要一个循环,某种迭代变量和一种排序。我无法弄明白。

这实际上是从MYSQL输出的。

3 个答案:

答案 0 :(得分:1)

修改
正如[最初]措辞一样,这个问题可以通过[至少;-)]两种方式来理解:

  • A)数组包含按升序排列的日期列表。任务是找到数组中 连续 日期之间的最长时间段(以天数表示)。
  • B)数组不一定要排序。任务是找到数组中 任意两个日期 之间的最长期(expr。天数)

以下提供了对该问题的“B”理解的答案。有关“A”的回复,请参阅dcneiner的解决方案


不需要排序!...

如果它来自MySQL,您可以让此DBMS直接返回所考虑列表的MIN和MAX值 编辑:正如Darkerstar所指出的,数据结构的方式[以及返回问题中指示的完整列表的现有SQL查询]通常决定了生成MIN和MAX值的查询的结构方式。
也许是这样的:

SELECT MIN(the_date_field), MAX(the_date_field)
FROM the_table
WHERE -- whatever where conditions if any
--Note: no GROUP BY needed

如果以某种方式不能使用SQL,单次通过列表将允许您获取列表中的MIN和MAX值(在O(n)时间内)。 算法很简单:
将最小值和最大值设置为[未排序]列表中的第一项 迭代列表中的每个后续项目,将其与最小值进行比较,如果发现较小则替换它,并对Max值进行相似的操作......

手中有最小值和最大值,一个简单的差异给出最大天数...
在PHP中,它看起来如下:

<?php
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');

# may need this as suggested by dcneiner
date_default_timezone_set("GMT");

$max = $array[0];
$min = $max;
for($i = 1; $i < count($array); $i++){
    // Note that since the strings in the array are in the format YYYY-MM-DD,
    // they can be compared as-is without requiring say strtotime conversion.
    if ($array[$i] < $min)
        $min = $array[$i];
    if ($array[$i] > $max)
        $max = $array[$i];
}
$day_count = (strtotime($max) - strtotime($min)) / (60*60*24);

?>

答案 1 :(得分:1)

以下是如何在PHP中执行此操作:

<?php
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');

# PHP was throwing errors until I set this
# it may be unnecessary depending on where you
# are using your code:
date_default_timezone_set("GMT");

$max = 0;
if( count($array) > 1 ){
    for($i = 0; $i < count($array) - 1; $i++){
        $start = strtotime( $array[$i] );
        $end   = strtotime( $array[$i + 1] );

        $diff  = $end - $start;
        if($diff > $max) $max = $diff; 
    }
}

$max = $max / (60*60*24);

?>

它循环抛出你的物品(它比物品数量少一个时间执行)并比较每一个物品。如果比较大于下一个,则更新最大值。时间以秒为单位,因此在循环结束后,我们将秒数转换为几天。

答案 2 :(得分:1)

此PHP脚本将为您提供最大的间隔

 1){     for($ i = 0; $ i $ maxinterval)$ maxinterval = $ days;     } } ?&GT;