几年,几个月和几周工作的数组,但一年的第01周显示不正确

时间:2013-11-27 18:13:09

标签: php arrays date

我有几年,几个月和几周。

//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日。关于如何解决这个问题的任何想法?事实上,我不确定如何处理边境案件。如果一个星期在一个月内开始但在另一个星期结束,则不应该插入两个月,我宁愿它在它结束的那个月。但不知道如何解决这个问题。

2 个答案:

答案 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