2013-03-13 4 views
1

мне нужно получить количество дней в течение каждого дня недели между двумя датами, как:получить число каждого дня недели между двумя датами

2013-01-01 to 2013-01-15 

Mo:2 
Tu:3 
We:2 
Th:2 
Fr:2 
Sa:2 
Su:2 

Я имел этот код не уверен, где я получил его раньше но, похоже, он работал, но понял, что некоторые диапазоны дат не работают, например, с 2013-03-01 по 2013-03-11 он сообщает в понедельник как 1 день вместо 2 дней.

function daysOfWeekBetween($start_date, $end_date, $weekDay) 
{ 
    $first_date = strtotime($start_date." -1 days"); 
    $first_date = strtotime(date("M d Y",$first_date)." next ".$weekDay); 

    $last_date = strtotime($end_date." +1 days"); 
    $last_date = strtotime(date("M d Y",$last_date)." last ".$weekDay); 

    return floor(($last_date - $first_date)/(7*86400)) + 1; 
} 

daysOfWeekBetween($date_range['start_date'], $date_range['end_date'], 'Monday'); 

ответ

0

Проверьте руководство по эксплуатации mktime(). Самый первый пример - именно то, что вам нужно.

Попробуйте это:

date_default_timezone_set('UTC'); 

function count_weekdays_between($start, $end) { 
    if (preg_match('/^(\d\d\d\d)-(\d\d)-(\d\d)$/', $start, $start) && preg_match('/^(\d\d\d\d)-(\d\d)-(\d\d)$/', $end, $end)) { 
     $start = mktime(0, 0, 0, $start[2], $start[3], $start[1]); 
     $end = mktime(0, 0, 0, $end[2], $end[3], $end[1]); 
     $offset = date('w', $start); 
     $delta = ($end - $start)/86400; 

     $result = array_fill(0, 7, floor($delta/7)); 

     for ($i = 0; $i <= ($delta % 7); ++$i) { 
      $result[$offset]++; 
      $offset = ($offset + 1) % 7; 
     } 
     return $result; 
    } 
    return false; 
} 
+0

Это только говорит мне, что одна дата. Нет ли математического способа понять это, не зацикливая каждую дату между двумя днями и выясняя изо дня в день, в какой день дата? – Danny

+0

Это не сработало: using 2013-03-01 - 2013-03-11 Я получаю это: 'Array ([0] => 2 [1] => 1 [2] => 1 [3] => 1 [ 4] => 1 [5] => 2 [6] => 2) 'Когда я должен получить' Array ([0] => 2 [1] => 2 [2] => 1 [3] => 1 [4] => 1 [5] => 2 [6] => 2) 'Это именно то, что мой оригинальный скрипт сделал с этим диапазоном дат (понедельник выключено). – Danny

+0

Здесь период 2013-03-01 - 2013-03-11 работал отлично. Попробуйте установить это в свой скрипт: 'date_default_timezone_set ('UTC');' – Havenard

0

Придумал раствором:

$interval = DateInterval::createFromDateString('1 day'); 
    $begin = new DateTime($date_range['start_date']); 
    $end = new DateTime($date_range['end_date']); 
    $period = new DatePeriod($begin, $interval, $end); 
    foreach($period as $dt) 
    { 
     $inner_data['average_days_counter'][$dt->format('D')] = isset($inner_data['average_days_counter'][$dt->format('D')]) ? $inner_data['average_days_counter'][$dt->format('D')] + 1 : 1; 
    } 
    // Array ([Mon] => 2 [Tue] => 1 [Wed] => 1 [Thu] => 1 [Fri] => 2 [Sat] => 2 [Sun] => 2) 
+0

Я думал, что вы хотите решение «без необходимости прокручивать каждую дату между двумя днями» – Havenard

+0

@Havenard Я сделал, но не смог найти его, так что это то, что Я буду использовать, если у кого-то еще не будет лучшего решения. – Danny

+0

Я только что дал вам лучшее решение. – Havenard

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