我想找到一个月和一年的每周时段.日期应从星期一开始,到星期日结束.如果该月的第一天是星期日(2011年5月),它应该是第一个元素.
2011年5月
> 5月1日(星期日)
> 5月2日 – 5月8日(周一至周日)
> 5月9日 – 5月15日(周一至周日)
> 5月17日 – Ma6y 22(周一至周日)
> 5月23日 – 5月29日(周一至周日)
> 5月30日 – 5月31日(周一至周二)
2012年9月
> 9月1日至9月2日
> 9月3日 – 9月9日
> 9月10日 – 9月16日
> 9月17日 – 9月23日
> 9月24日 – 9月30日
我正在使用此函数计算两个日期的周数 – 即.该月的第一天和该月的最后一天.
public function getWeekNumbers($startDate, $endDate)
{
$p = new DatePeriod(
new DateTime($startDate),
new DateInterval('P1W'),
new DateTime($endDate)
);
$weekNumberList = array();
foreach ($p as $w)
{
$weekNumber = $w->format('W');
$weekNumberList[] = ltrim($weekNumber, '0');
}
return $weekNumberList;
}
奇怪的是,对于1月份,当我期待[1,2,3,4,5]时,它会返回[52,1,2,3,4]的周数.
一旦我有周数,我就像这样使用它们:
//The following loop will populate the dataset with the entire month's durations - regardless if hours were worked or not.
$firstDayOfMonth = date('Y-m-d', strtotime("first day of {$this->year}-{$monthName}"));
$lastDayOfMonth = date('Y-m-d', strtotime("last day of {$this->year}-{$monthName}"));
foreach ($this->getWeekNumbers($firstDayOfMonth, $lastDayOfMonth) as $key => $weekId)
{
// find first mоnday of the year
$firstMon = strtotime("mon jan {$this->year}");
// calculate how many weeks to add
$weeksOffset = $weekId - date('W', $firstMon);
$beginDays = $weeksOffset * 7;
$endDays = ($weeksOffset * 7) + 6;
$searchedMon = strtotime(date('Y-m-d', $firstMon) . " +{$beginDays} days");
$searchedSun = strtotime(date('Y-m-d', $firstMon) . " +{$endDays} days");
echo date("M d", $searchedMon) . " - " . date("M d", $searchedSun);
}
因为getWeekNumbers函数没有返回我期望的周数,所以上述函数的输出是不足为奇的
> 12月24日 – 12月30日(2012年)
> 1月2日 – 1月8日(2012年)
> 1月9日 – 1月15日(2012年)
> 1月16日 – 1月22日(2012)
> 1月23日 – 1月29日(2012)
请注意,第1行(12月24日 – 12月30日)是当年(2012年)的结束,而不是去年年底(2011年).
理想情况下,我希望它看起来像
有任何想法吗?谢谢!!
解决方法:
如果您需要选定月份的所有周数以及所选周的所有日期,那么这就是您所需要的:
function getWeekDays($month, $year)
{
$p = new DatePeriod(
DateTime::createFromFormat('!Y-n-d', "$year-$month-01"),
new DateInterval('P1D'),
DateTime::createFromFormat('!Y-n-d', "$year-$month-01")->add(new DateInterval('P1M'))
);
$datesByWeek = array();
foreach ($p as $d) {
$dateByWeek[ $d->format('W') ][] = $d;
}
return $dateByWeek;
}
getWeekDays()函数返回多维数组.第一个关键是周数. 2级是数组,其日期保存为DateTime对象.
获取示例:
print_r( getWeekDays(5, 2011) ); # May 2011
print_r( getWeekDays(9, 2012) ); # Sep 2012
我有一点额外的时间,所以我写了一个例子;-)
$datesByWeek = getWeekDays(8, 2012);
$o = '<table border="1">';
$o.= '<tr><th>Week</th><th>Monday</th><th>Tuesday</th><th>Wednesday</th><th>Thursday</th><th>Friday</th><th>Saturday</th><th>Sunday</th></tr>';
foreach ($datesByWeek as $week => $dates) {
$firstD = $dates[0];
$lastD = $dates[count($dates)-1];
$o.= "<tr>";
$o.= "<td>" . $firstD->format('M d') . ' - ' . $lastD->format('M d') . "</td>";
$N = $firstD->format('N');
for ($i = 1; $i < $N; $i++) {
$o.= "<td>-</td>";
}
foreach ($dates as $d) {
$o.= "<td>" . $d->format('d.') . " / 0.00</td>";
# for selected date do you magic
}
$N = $lastD->format('N');
for ($i = $N; $i < 7; $i++) {
$o.= "<td>-</td>";
}
$o.= "</tr>";
}
$o.= '</table>';
echo $o;
输出如下: