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年日历的所有其他日期都是正确的。
答案 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;
}