我有几年,几个月和几周。
//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日。关于如何解决这个问题的任何想法?事实上,我不确定如何处理边境案件。如果一个星期在一个月内开始但在另一个星期结束,则不应该插入两个月,我宁愿它在它结束的那个月。但不知道如何解决这个问题。
答案 0 :(得分:0)
在开始日期的周中使用星期四作为起点,然后再添加几周。星期四将永远在正确的月份(因为这是我们用来决定我们将在12月的最后一周有53周或第1周)。如果星期四是1月份,那么你将获得W1和1月,如果是12月份,那么你将获得W53和12月。
如果您希望每周结束一个月,请使用星期日作为起点。
答案 1 :(得分:0)
您认为正确,周“属于”周开始日期的月份,因此您的输出是正确的。
如果您希望在一周中将月份设置为最后一天,可以使用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');
}
但现在每个星期都有2个月不同,W05现在是2月份。
<强> Demo 强>