2013-03-13 68 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