如何在特定时间段内获得所有工作天(周一至周五)(比方说,直到下个月月底)?
答案 0 :(得分:3)
如果您使用的是PHP 5.2+,则可以使用我编写的库来处理名为When的PHP中的日期递归。
使用库,代码将类似于:
$r = new When();
$r->recur(<start date here>, 'weekly')
->until(<end date here>)
->wkst('SU')
->byday(array('MO', 'TU', 'WE', 'TH', 'FR'));
while($result = $r->next())
{
echo $result->format('c') . '<br />';
}
答案 1 :(得分:2)
在此处试试:http://codepad.org/wuAyAqnF
要使用它,只需将时间戳传递给get_weekdays
即可。你可以在当月剩下的时间里找到所有工作日的数组,作为时间戳。或者,您可以传递$to
参数 - 您将在$from
和$to
之间获得所有工作日。
function get_weekdays ($from, $to=false) {
if ($to == false)
$to = last_day_of_month($from);
$days = array();
for ($x = $from; $x < $to; $x+=86400 ) {
if (date('w', $x) > 0 && date('w', $x) < 6)
$days[] = $x;
}
return $days;
}
function last_day_of_month($ts=false) {
$m = date('m', $ts);
$y = date('y', $ts);
return mktime(23, 59, 59, ($m+1), 0, $y);
}
答案 2 :(得分:2)
此示例以快速有效的方式完全满足您的需求。 它不执行嵌套循环并使用完全令人敬畏的DateTime对象。
$oDateTime = new DateTime();
$oDayIncrease = new DateInterval("P1D");
$aWeekDays = array();
$sStart = $oDateTime->format("m-Y");
while($oDateTime->format("m-Y") == $sStart) {
$iDayInWeek = $oDateTime->format("w");
if ($iDayInWeek > 0 && $iDayInWeek < 6) {
$aWeekDays[] = clone $oDateTime;
}
$oDateTime->add($oDayIncrease);
}
答案 3 :(得分:1)
我想你可以遍历日期并查看每个日期的日,并增加一个计数器。
无法想到其他任何事情。
答案 4 :(得分:1)
Pseudocode顺其自然:
计算从现在到该月的最后一天之间的天数 获取当周的当天(即星期三) 根据当周的当天以及当月剩余的天数,可以通过简单的计算来计算当月剩余的周末天数 - 它将是该月剩余的天数,减去本月剩余的星期日/星期六。
我会编写一个函数,例如:
daysLeftInMonth(daysLeftInMonth, startingDayOfWeek, dayOfWeekToCalculate)
其中:
所以,你的算法就像:
getWeekdaysLeft(todaysDate)
... getWeekdaysLeft类似于:
sundaysLeft = daysLeftInMonth(lastDayOfMonth - todaysDate, "Wednesday", "Sunday");
saturdaysLeft = daysLeftInMonth(lastDayOfMonth - todaysDate, "Wednesday", "Saturday");
return ((lastDayOfMonth - todaysDate) - (sundaysLeft + saturdaysLeft));
答案 5 :(得分:1)
此代码至少执行您要求的一部分。它不是“下个月末”,而是在给定的天数内工作。
$dfrom = time();
$fourweeks = 7 * 4;
for ($i = 0; $i < $fourweeks; $i ++) {
$stamp = $dfrom + ($i * 24 * 60 * 60);
$weekday = date("D", $stamp);
if (in_array($weekday, array("Mon", "Tue", "Wed", "Thu", "Fri"))) {
print date(DATE_RSS, $stamp) . "\n";
}
}
答案 6 :(得分:1)
// Find today's day of the month (i.e. 15)
$today = intval(date('d'));
// Define the array that will hold the work days.
$work_days = array()
// Find this month's last day. (i.e. 30)
$last = intval(date('d', strtotime('last day of this month')));
// Loop through all of the days between today and the last day of the month (i.e. 15 through 30)
for ( $i = $today; $i <= $last; $i++ )
{
// Create a timestamp.
$timestamp = mktime(null, null, null, null, $i);
// If the day of the week is greater than Sunday (0) but less than Saturday (6), add the timestamp to an array.
if ( intval(date('w', $timestamp)) > 0 && intval(date('w', $timestamp)) < 6 )
$work_days[] = mktime($timestamp);
}
$work_days
数组将包含您可以使用这种方式的时间戳:
echo date('Y-m-d', $work_days[0]);
上面的代码在PHP 4以及PHP 5中工作。它不依赖于DateTime类的功能,该功能在PHP 5.2之前不可用,并且不需要使用由其他人创建的“库”。