如何find两个date之间的星期一或星期二的数量?

我有开始date和结束date。

我需要找出周日或周一的日子,依靠用户点击checkbox。

我如何find/计算在PHP中?

你可以创build一个函数,recursion地使用strtotime()来计算天数。 由于strtotime("next monday"); 工作得很好。

 function daycount($day, $startdate, $counter) { if($startdate >= time()) { return $counter; } else { return daycount($day, strtotime("next ".$day, $startdate), ++$counter); } } echo daycount("monday", strtotime("01.01.2009"), 0); 

希望这是你正在寻找的东西:)

没有循环,没有recursion

 <?php define('ONE_WEEK', 604800); // 7 * 24 * 60 * 60 function number_of_days($days, $start, $end) { $w = array(date('w', $start), date('w', $end)); $x = floor(($end-$start)/ONE_WEEK); $sum = 0; for ($day = 0;$day < 7;++$day) { if ($days & pow(2, $day)) { $sum += $x + ($w[0] > $w[1]?$w[0] <= $day || $day <= $w[1] : $w[0] <= $day && $day <= $w[1]); } } return $sum; } //$start = $end = time(); // 0x10 == pow(2, 4) == 1 << 4 // THURSDAY // 0x20 == pow(2, 5) == 1 << 5 // FRIDAY echo number_of_days(0x01, $start, $end); // SUNDAY echo number_of_days(pow(2, 0), $start, $end); // SUNDAY echo number_of_days(0x02, $start, $end); // MONDAY echo number_of_days(pow(2, 1), $start, $end); // MONDAY echo number_of_days(0x04, $start, $end); // TUESDAY echo number_of_days(1 << 2, $start, $end); // TUESDAY echo number_of_days(0x08, $start, $end); // WEDNESDAY echo number_of_days(1 << 3, $start, $end); // WEDNESDAY echo number_of_days(0x10, $start, $end); // THURSDAY echo number_of_days(0x20, $start, $end); // FRIDAY echo number_of_days(0x40, $start, $end); // SATURDAY echo number_of_days(0x01 | 0x40, $start, $end); // WEEKENDS : SUNDAY | SATURDAY echo number_of_days(0x3E, $start, $end); // WORKDAYS : MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY ?> 

这个问题只是为了使用PHP的DateTime类更新的答案,所以这里是:

 /** * @param String $dayName eg 'Mon', 'Tue' etc * @param DateTimeInterface $start * @param DateTimeInterface $end * @return int */ function countDaysByName($dayName, \DateTimeInterface $start, \DateTimeInterface $end) { $count = 0; $interval = new \DateInterval('P1D'); $period = new \DatePeriod($start, $interval, $end); foreach($period as $day){ if($day->format('D') === ucfirst(substr($dayName, 0, 3))){ $count ++; } } return $count; } 

w35I3y的答案几乎是正确的,但是我正在使用该函数得到错误。 此function可正确计算两个给定date之间的星期一或特定date的数量:

 /** * Counts the number occurrences of a certain day of the week between a start and end date * The $start and $end variables must be in UTC format or you will get the wrong number * of days when crossing daylight savings time * @param - $day - the day of the week such as "Monday", "Tuesday"... * @param - $start - a UTC timestamp representing the start date * @param - $end - a UTC timestamp representing the end date * @return Number of occurences of $day between $start and $end */ function countDays($day, $start, $end) { //get the day of the week for start and end dates (0-6) $w = array(date('w', $start), date('w', $end)); //get partial week day count if ($w[0] < $w[1]) { $partialWeekCount = ($day >= $w[0] && $day <= $w[1]); }else if ($w[0] == $w[1]) { $partialWeekCount = $w[0] == $day; }else { $partialWeekCount = ($day >= $w[0] || $day <= $w[1]); } //first count the number of complete weeks, then add 1 if $day falls in a partial week. return floor( ( $end-$start )/60/60/24/7) + $partialWeekCount; } 

用法示例:

 $start = strtotime("tuesday UTC"); $end = strtotime("3 tuesday UTC"); echo date("m/d/Y", $start). " - ".date("m/d/Y", $end). " has ". countDays(0, $start, $end). " Sundays"; 

输出如下:09/28/2010 – 10/19/2010有3个星期天。

 <?php $date = strtotime('2009-01-01'); $dateMax = strtotime('2009-02-23'); $nbr = 0; while ($date < $dateMax) { var_dump(date('Ym-d', $date)); $nbr++; $date += 7 * 24 * 3600; } echo "<pre>"; var_dump($nbr); ?> 

统计两个date之间的星期五##

 $from_date=(2015-01-01); $to_date=(2015-01-20); while(strtotime($from_date) <= strtotime($to_date)){ //5 for count Friday, 6 for Saturday , 7 for Sunday if(date("N",strtotime($from_date))==5){ $counter++; } $from_date = date ("Ymd", strtotime("+1 day", strtotime($from_date))); } echo $counter; 
 function daycount($day, $startdate, $enddate, $counter) { if($startdate >= $enddate) { return $counter-1; // A hack to make this function return the correct number of days. } else { return $this->daycount($day, strtotime("next ".$day, $startdate), $enddate, ++$counter); } } 

这是第一个答案的不同版本,它需要一个开始和结束点,并为我工作。 在这个页面上给出的所有例子似乎都是由于某种原因返回的答案加上一天。

w35l3y的答案似乎运作良好,所以我投了赞成票。 尽pipe如此,我更喜欢一些更容易遵循的东西,并且用更less的math和循环(虽然从性能的angular度来看不太确定)。 我想我已经涵盖了所有可能的场景……下面是我想到的:

 function numDays($sday, $eday, $i, $cnt) { if (($sday < $eday && $i >= $sday && $i <= $eday) || ($sday > $eday && ($i >= $sday || $i <= $eday))) { // partial week (implied by $sday != $eday), so $i (day iteration) may have occurred one more time // a) end day is ahead of start day; $i is within start/end of week range // b) start day is ahead of end day (ie, Tue start, Sun end); $i is either in back half of first week or front half of second week $cnt++; } elseif ($sday == $eday && $i == $sday) { // start day and end day are the same, and $i is that day, ie, Tue occurs twice from Tue-Tue (1 wk, so $wks = $cnt) $cnt++; } return $cnt; // # of complete weeks + partial week, if applicable } 

注意:$ sday和$ eday是对应于要检查的范围的开始和结束的天数,而$ i是被计数的天数(我在0-6循环中)。 我把$ wks移到了函数之外,因为每次都没有重新计算。

 $wks = floor(($endstamp - $startstamp)/7*24*60*60); $numDays = numDays($sday, $eday, $i, $wks); 

确保你比较的开始/结束时间戳具有相同的时区调整,如果有的话,否则你总是会有一点点$ cnt和$ wks。 (我从一年的未经调整的第一次计算到调整后的date/时间X时遇到了这个问题)

我得到了答案,它只在星期天工作,但我不知道如何再来一天

“; $ days_until_sunday = date('w',$ start)> 0?7 – date('w',$ start):0; $ date = $ start +(ONE_DAY * $ days_until_sunday); $ sundays = array() ;($ date“; $ count = 0; //循环输出Ymd foreach(sundays_in_range($ start,$ end)as $ sunday){print”“.date(”Ymd“,$ sunday)
“; $ count ++;} echo $ count;?>