我有一个年、月和周的数组。
//Returns an array containing the years, months and week numbers between two dates
function year_month($start_date, $end_date)
{
$begin = new DateTime( $start_date );
$end = new DateTime( $end_date);
$end->add(new DateInterval('P1W')); //Add 1 week to include the end date as a week
$interval = new DateInterval('P1W'); //Add 1 week
$period = new DatePeriod($begin, $interval, $end);
$aResult = array();
foreach ( $period as $dt )
{
$aResult[$dt->format('Y')][$dt->format('M')][] = "W".$dt->format('W');
}
return $aResult;
}
echo '<pre>';
print_r(year_month("25-11-2013","26-01-2014"));
echo '</pre>';
它输出以下内容:
Array
(
[2013] => Array
(
[Nov] => Array
(
[0] => W48
)
[Dec] => Array
(
[0] => W49
[1] => W50
[2] => W51
[3] => W52
[4] => W01
)
)
[2014] => Array
(
[Jan] => Array
(
[0] => W02
[1] => W03
[2] => W04
[3] => W05
)
)
)
请注意,w01在Dec数组中,而不是在January数组中。我想这是因为星期一是每周的开始,在这种情况下,星期一是12月30日。关于如何绕过这个问题有什么想法吗?事实上,我不确定如何处理一般的边境案件。如果一周从一个月开始,但在另一个月结束,它不应该同时插入两个月,我宁愿它在它结束的月份。但不知道该怎么做。
在添加周之前,使用开始日期所在周的星期四作为开始点。星期四总是在正确的月份(因为这是我们用来决定12月最后一周是第53周还是第1周的时间)。如果星期四是在一月,你会得到W1和一月,如果是在十二月,你会获得W53和十二月。
如果你想每次都以一个月或一周结束,那就把星期天作为起点。
您假设周"属于"周开始日期所在的月份,所以您的输出是正确的。
如果您希望将月份设置为一周中的最后一天,可以使用setISODate()
方法完成:
foreach ($period as $dt) {
$dt->setISODate($dt->format('o'), $dt->format('W'), 7);
$aResult[$dt->format('Y')][$dt->format('M')][] = "W".$dt->format('W');
}
但这将适用于两个不同月份的每一周,W05现在是二月。
演示