2013-07-11 1 views
0

Я знаю, как рассчитать разницу дат с помощью PHP;Как найти разницу в дате, исключая конкретные даты в массиве - 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); 

и т.д., проведение некоторых конкретных дат, можно вычислить разницу дат за исключением дат в массиве наряду с воскресенья, если они лежат в между даты начала и окончания?

+0

это дубликат вопрос http://stackoverflow.com/questions/10595524/date-range-array-excluding-the-sunday-the-holiday -in-php? rq = 1 – DevZer0

+0

Если вы используете формат Ymd (например, MySQL), вы можете использовать 'max ($ datearray)' и 'min ($ datearray)' как конец и начало. И strtotime() более глобально можно использовать с этим, поскольку d-m-y и m-d-y используются форматы, но не дают одинаковых результатов strtotime. __WARNING__ глядя на данные '20-05-2013', вы используете британский формат, поэтому strtotime() не сработает для вас! – Waygood

+0

вам повезло, что strtotime не искажает эти значения даты. Являются ли они 3 января и 6 января? или 1 марта и 1 июня? никогда НИКОГДА не зависит от strtotime, чтобы делать «правильную вещь». –

ответ

0

просто проведите через $datesarray и проверьте их, если они находятся между $olddate и $newdate. Если это так, увеличьте переменную $counter (которая начинается с 0, очевидно). Затем $date_diff - $counter даст вам ожидаемый результат.

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" 
} 
+0

не работает bro .. :(можете ли вы показать демо на codepad.org? Вот ваш код http: // codepad. орг/XL9gkJ9d –

0

Следующий скрипт создает и массив временные метки из вашего массива британских дат, а затем вычисляет max и мин. временные метки для расчета разницы в днях.

Если отметка времени по умолчанию равна 0, она не добавляется к массиву временных меток, исключая огромные результаты за одну плохую дату по умолчанию по умолчанию I.e. Когда некорректная дата или до эпохи 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]); 
} 
?> 

 Смежные вопросы

  • Нет связанных вопросов^_^