0

我知道如何使用 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);

等等,持有一些特定的日期,如果它们位于开始日期和结束日期之间,是否可以计算日期差异,不包括数组中的日期以及星期天?

4

3 回答 3

0

以下脚本根据您的英国日期数组创建时间戳数组,然后计算最大最小时间戳以计算天数差异。

如果时间戳默认为 0,则不会添加到时间戳数组中,避免一个错误日期默认为纪元(即当日期无效或纪元 1/1/1970 前)产生巨大结果

<?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]);
}
?>
于 2013-07-18T09:34:38.363 回答
0

只需循环遍历$datesarray并检查每个是否在$olddate和之间$newdate。如果是这样,增加一个$counter变量(显然从 0 开始)。然后$date_diff-$counter会给你预期的结果。

于 2013-07-11T15:04:38.017 回答
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"
}
于 2013-07-11T15:08:46.313 回答