我正在尝试查找给定月份和年份的每周周期。日期应从星期一开始,到星期日结束。如果一个月的 1 日是星期日(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)
请注意,第一行(12 月 24 日 - 12 月 30 日)是当年年底(2012 年),而不是去年年底(2011 年)。
理想情况下,我希望它看起来像
有任何想法吗?谢谢!!