2013-03-13 95 views
1

之間我需要的天數爲一週的每一天兩個日期之間,如:得到一週的每一天數兩個日期

2013-01-01 to 2013-01-15 

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

我有這個代碼不知道在那裏我才知道了但它似乎工作,但實現了一些日期範圍它不起作用,如2013年3月1日至2013年3月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 2013-03-13 21:37:16

+0

這沒用:使用2013-03-01 - 2013-03-11我得到這個:'Array([0] => 2 [1] => 1 [2] => 1 [3] => 1 [ 4] => 1 [5] => 2 [6] => 2)'當我應該得到數組([0] => 2 [1] => 2 [2] => 1 [3] => 1 [4] => 1 [5] => 2 [6] => 2)'這個日期範圍內的原始腳本就是這樣(星期一關閉)。 – Danny 2013-03-14 00:41:32

+0

這裏期間2013-03-01 - 2013-03-11工作得很好。嘗試將其設置爲您的腳本:'date_default_timezone_set('UTC');' – Havenard 2013-03-14 03:37:44

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 2013-03-13 23:47:34

+0

@Havenard我做了但找不到一個,所以這就是我會使用,除非別人有更好的解決方案。 – Danny 2013-03-14 00:27:49

+0

我剛剛給你一個更好的解決方案。 – Havenard 2013-03-14 00:28:20

相關問題