在1月份的日历中收到额外的1

时间:2014-11-26 09:19:30

标签: php calendar mktime

function getDates($year){

$dates = array();

for($i = 1; $i <= 366; $i++){ 
    $month = date('m', mktime(0,0,0,1,$i,$year)); // outputs month 01 for jan etc
    $wk = date('W', mktime(0,0,0,1,$i,$year)); // this outputs 01 if 1st week etc  
    $wkDay = date('D', mktime(0,0,0,1,$i,$year)); //weekday eg mon ,sun etc
    echo $day = date('d', mktime(0,0,0,1,$i,$year)); // outputs day eg 01,13,23 etc

    $dates[$month][$wk][$wkDay] = $day;  // storing date in array 
    } 

return $dates; 
}

$dates = getDates(2014);

echo '<br/>'.$dates['01']['01']['Wed']; // getting 01
echo '<br/>'.$dates['01']['01']['Thu']; // 01 (should get 02 as it is 2nd jan thu in 2014)
echo '<br/>'.$dates['01']['01']['Fri']; // 03

当我回复$ day in for循环我收到01 02 03 04等这是正确的,但是当我在上面的$ dates数组中回应相同时,我在第一个星期的第一个星期三和星期四的第一个星期星期四收到01。为什么?我哪里错了?我收到的2014年日历的所有其他日期都是正确的。

3 个答案:

答案 0 :(得分:2)

@ymas是对的。由于您在2014年使用366天,因此编号366是2015年的第一天。这导致2015年的第一天覆盖当前阵列中的值。通过检查一年中的天数并使用该值代替静态366来解决此问题。这将是这样的:

function getDates($year){

    $dates = array();

    $daysInYear = date("z", mktime(0,0,0,12,31,$year)) + 1;
    for($i = 1; $i <= $daysInYear; $i++){ 

        $month = date('m', mktime(0,0,0,1,$i,$year)); // outputs month 01 for jan etc
        $wk = date('W', mktime(0,0,0,1,$i,$year)); // this outputs 01 if 1st week etc  
        $wkDay = date('D', mktime(0,0,0,1,$i,$year)); //weekday eg mon ,sun etc
        echo $day = date('d', mktime(0,0,0,1,$i,$year)); // outputs day eg 01,13,23 etc
        $dates[$month][$wk][$wkDay] = $day;  // storing date in array 
    }
    return $dates; 
}

请注意,您不应将365用作静态值,因为在闰年将无法使用31 dec。

答案 1 :(得分:1)

我建议使用DateTime对象:

    function newGetDates($year) {
        $start = new DateTime("$year-01-01");
        $end = new DateTime("$year-12-31 23:59");

        $period = new DatePeriod($start, new DateInterval('P1D'), $end);
        $dates = array();

        foreach($period as $day) {
            $dates[$day->format('m')][$day->format('W')][$day->format('D')] 
                = $day->format('d');
        }

        return $dates;
    }

答案 2 :(得分:1)

您在循环中生成相同的时间戳4x,这是过度的。将时间戳存储在变量中,然后使用该变量调用date()函数:see how

更好,更快,更少内存消耗的解决方案是使用DateTime,如下所示:

function getDates($year) {
    $dt = new DateTime("$year-01-01");
    while ($year == $dt->format('Y')) {
        $dates[$dt->format('m')][$dt->format('W')][$dt->format('D')] = $dt->format('d');
        $dt->modify('+1 day');
    }
    return $dates;
}

demo