php实现一个日历表
实现日历表的基本思路
日历表的核心是根据给定年份和月份,计算该月的天数、起始星期,并生成对应的日期排列。PHP提供了丰富的日期时间函数,可以简化计算过程。
获取月份的基本信息
使用date()和cal_days_in_month()函数获取当前月份的天数和第一天是星期几:
$year = date('Y');
$month = date('m');
$daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$firstDay = date('w', strtotime("$year-$month-01"));
生成日历表格结构
创建一个HTML表格,表头显示星期几。根据起始星期调整第一行的空白单元格:

echo '<table border="1">';
echo '<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>';
echo '<tr>';
// 填充第一行前面的空白
for ($i = 0; $i < $firstDay; $i++) {
echo '<td></td>';
}
填充日期单元格
循环填充日期,每7天换行:
$dayCount = 1;
for ($i = $firstDay; $i < 7; $i++) {
echo '<td>' . $dayCount . '</td>';
$dayCount++;
}
echo '</tr>';
// 填充剩余行
while ($dayCount <= $daysInMonth) {
echo '<tr>';
for ($i = 0; $i < 7 && $dayCount <= $daysInMonth; $i++) {
echo '<td>' . $dayCount . '</td>';
$dayCount++;
}
echo '</tr>';
}
echo '</table>';
完整代码示例
将上述代码整合为一个完整的日历生成函数:

function generateCalendar($year = null, $month = null) {
$year = $year ?? date('Y');
$month = $month ?? date('m');
$daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$firstDay = date('w', strtotime("$year-$month-01"));
echo '<table border="1">';
echo '<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>';
echo '<tr>';
for ($i = 0; $i < $firstDay; $i++) {
echo '<td></td>';
}
$dayCount = 1;
for ($i = $firstDay; $i < 7; $i++) {
echo '<td>' . $dayCount . '</td>';
$dayCount++;
}
echo '</tr>';
while ($dayCount <= $daysInMonth) {
echo '<tr>';
for ($i = 0; $i < 7 && $dayCount <= $daysInMonth; $i++) {
echo '<td>' . $dayCount . '</td>';
$dayCount++;
}
echo '</tr>';
}
echo '</table>';
}
// 使用示例
generateCalendar(2023, 5);
样式优化建议
为日历添加CSS样式,提升视觉效果:
echo '<style>
table {
border-collapse: collapse;
width: 300px;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: center;
}
th {
background-color: #f2f2f2;
}
</style>';
扩展功能
-
添加月份导航:
echo '<div> <a href="?year='.($month == 1 ? $year-1 : $year).'&month='.($month == 1 ? 12 : $month-1).'">上个月</a> <span>'.$year.'年'.$month.'月</span> <a href="?year='.($month == 12 ? $year+1 : $year).'&month='.($month == 12 ? 1 : $month+1).'">下个月</a> </div>'; -
高亮当前日期:
$currentDay = date('j'); if ($year == date('Y') && $month == date('m') && $dayCount == $currentDay) { echo '<td style="background-color:yellow;">' . $dayCount . '</td>'; } else { echo '<td>' . $dayCount . '</td>'; }
这个实现提供了基本的日历功能,可以根据需要进一步扩展样式和交互功能。






