一系列的年、月和周在工作,但一年中的第01周表现得不正确


Array of years, months and weeks working but week 01 of year showing incorrecltly

我有一个年、月和周的数组。

//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现在是二月。

演示