如何找到排除数组中特定日期的日期差异 - PHP

时间:2013-07-11 14:59:38

标签: php date php-5.3 datediff

我知道如何使用PHP计算日期差异;

$newdate = "01-03-2013";
$olddate = "01-06-2013";
$date_diff = abs(strtotime($olddate)-strtotime($newdate)) / 86400;
echo $date_diff;

但是假设,如果我在数组中有一些日期,那么;

$datesarray = array(10-05-2013, 20-05-2013, 12-08-2013);

等,持有一些具体的日期,是否可以计算日期差异,不包括星期日和星期日,如果它们位于开始日期和结束日期之间?

3 个答案:

答案 0 :(得分:0)

只需遍历$datesarray并检查每个$olddate$newdate之间的位置。如果是这样,请增加$counter变量(显然从0开始)。 然后$date_diff - $counter会为您提供预期的结果。

答案 1 :(得分:0)

我会在自定义函数中使用DateTime类:

function dates_between(DateTime $start, DateTime $end, $format = 'm-d-Y') {
    $date = $start;
    $dates = array();
    $oneDay = new DateInterval('P1D');
    // push all dates between start and end to the result
    while(($date = $date->add($oneDay)) < $end) {
        $dates []= $date->format($format);
    }
    return $dates;
}

使用示例:

$now = new DateTime();
$nextWeek = new DateTime('+1 week');
var_dump(dates_between($now, $nextWeek));

输出:

array(6) {
  [0] =>
  string(10) "07-12-2013"
  [1] =>
  string(10) "07-13-2013"
  [2] =>
  string(10) "07-14-2013"
  [3] =>
  string(10) "07-15-2013"
  [4] =>
  string(10) "07-16-2013"
  [5] =>
  string(10) "07-17-2013"
}

答案 2 :(得分:0)

以下脚本会从您的UK日期数组中创建时间戳数组,然后计算最大 min 时间戳来计算天数差异。

如果时间戳默认为0,则不会将其添加到时间戳数组中,从而避免一个错误日期默认为时间戳的巨大结果 即当日期无效或前世纪前1/1/19

<?php

$datesarray = array('10-05-2013', '20-05-2013', '12-08-2013');

$date_diff=0; // default for 0 or 1 dates
if( (is_array($datesarray)) && (sizeof($datesarray)>1) )
{
    $timestampsarray=array();
    reset($datesarray);
    while(list($key,$value)=each($datesarray))
    {
        $timestamp=timestamp_from_UK($value);
        if($timestamp!=0) $timestampsarray[$key]=$timestamp;
    }
    $date_diff = abs(max($timestampsarray)-min($timestampsarray)) / 86400;
}
echo $date_diff;

function timestamp_from_UK($ukdatetime)
{
    // where PHP is processing UK dates d-m-y correctly
    $ukdatetime=str_replace('/', '-', $ukdatetime);
    if(date("d", strtotime("1-2-1970"))==1) return strtotime($ukdatetime);

    // Fallback script for when PHP is NOT processing UK dates
    $success=false;
    if(!$success) $success=preg_match("/([0-9]{1,2})[^0-9]([0-9]{1,2})[^0-9]([0-9]{2,4})[^0-9]([0-9]{1,2})[^0-9]([0-9]{1,2})[^0-9]([0-9]{1,2})/", $ukdatetime, $matches);
    if(!$success) $success=preg_match("/([0-9]{1,2})[^0-9]([0-9]{1,2})[^0-9]([0-9]{2,4})[^0-9]([0-9]{1,2})[^0-9]([0-9]{1,2})/", $ukdatetime, $matches);
    if(!$success) $success=preg_match("/([0-9]{1,2})[^0-9]([0-9]{1,2})[^0-9]([0-9]{2,4})/", $ukdatetime, $matches);
    if(!$success) return 0;

    // ensure all values are set - to avoid invalid offset
    for($i=4;$i<=6;$i++)
    {
        if(!isset($matches[$i])) $matches[$i]=0;
    }
    // $matches[0] is the full matched string
    return mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[1], $matches[3]);
}
?>