
在构建动态web应用程序时,集成一个功能完善的日历是常见需求。其中一个核心功能是能够准确地识别并高亮显示当前日期,确保用户总能清晰地看到“今天”是哪一天。然而,在php中实现这一功能时,开发者常遇到日期显示不更新或高亮不准确的问题。本教程将详细解析这些问题,并提供一套专业的解决方案。
一个常见的错误模式是在日历生成逻辑中,对“当前日期”的引用不够一致。原始代码片段中,date('Y-m-d')被多次调用,一次用于初始化$datetoday,另两次在循环内部用于比较。尽管PHP的date()函数通常会返回当前的系统日期,但反复调用可能导致以下潜在问题:
核心问题在于,如果date('Y-m-d')在每次循环迭代时返回的“当前日期”字符串没有及时更新(例如,服务器时间已过午夜但PHP进程未刷新其对系统时间的感知,或者更可能的情况是,代码逻辑本身没有正确利用这个“当前日期”),那么$date==date('Y-m-d')的判断就会失效,导致当前日期无法被正确标记。
PHP的DateTime类提供了一个强大且面向对象的方式来处理日期和时间。通过在函数开始时创建一个DateTime对象来表示“现在”,我们可以确保整个日历生成过程中对当前日期的引用是统一且准确的。
我们将对原始的 build_calendar 函数进行重构,主要关注以下几点:
立即学习“PHP免费学习笔记(深入)”;
<?php
/**
 * 构建一个HTML日历表格。
 *
 * @param int $month 要显示的月份 (1-12)。
 * @param int $year 要显示的年份。
 * @return string 生成的HTML日历表格。
 */
function build_calendar($month, $year) {
    // 创建一个DateTime对象来表示当前时间,并格式化为 YYYY-MM-DD 字符串,作为统一的“今天”参照。
    $currentDate = new DateTime();
    $today_string = $currentDate->format('Y-m-d');
    // 定义一周中的天数名称
    $daysOfWeek = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
    // 获取该月第一天的时间戳
    $firstDayOfMonth = mktime(0, 0, 0, $month, 1, $year);
    // 获取该月总天数
    $numberDays = date('t', $firstDayOfMonth);
    // 获取该月第一天的详细信息
    $dateComponents = getdate($firstDayOfMonth);
    // 获取月份名称
    $monthName = $dateComponents['month'];
    // 获取该月第一天是星期几 (0-6, 0为星期日)
    $dayOfWeek = $dateComponents['wday'];
    // 构建日历头部
    $calendar = "<table class='table table-bordered'>";
    $calendar .= "<center><h2>$monthName $year</h2>";
    // 导航按钮
    $calendar .= "<a class='btn btn-xs btn-primary' href='?month=" . date('m', mktime(0, 0, 0, $month - 1, 1, $year)) . "&year=" . date('Y', mktime(0, 0, 0, $month - 1, 1, $year)) . "'>上月</a> ";
    $calendar .= " <a class='btn btn-xs btn-primary' href='?month=" . $currentDate->format('m') . "&year=" . $currentDate->format('Y') . "'>本月</a> ";
    $calendar .= "<a href='?month=" . date('m', mktime(0, 0, 0, $month + 1, 1, $year)) . "&year=" . date('Y', mktime(0, 0, 0, $month + 1, 1, $year)) . "' class='btn btn-xs btn-primary'>下月</a></center><br>";
    $calendar .= "<tr>";
    // 添加星期几的标题
    foreach ($daysOfWeek as $day) {
        $calendar .= "<th class='header'>$day</th>";
    }
    $calendar .= "</tr><tr>";
    // 填充月初的空单元格
    if ($dayOfWeek > 0) {
        for ($k = 0; $k < $dayOfWeek; $k++) {
            $calendar .= "<td class='empty'></td>";
        }
    }
    // 初始化日计数器
    $currentDay = 1;
    $month_padded = str_pad($month, 2, "0", STR_PAD_LEFT);
    // 循环遍历该月的所有天数
    while ($currentDay <= $numberDays) {
        // 如果达到星期六,开始新的一行
        if ($dayOfWeek == 7) {
            $dayOfWeek = 0;
            $calendar .= "</tr><tr>";
        }
        $currentDayRel = str_pad($currentDay, 2, "0", STR_PAD_LEFT);
        $date_cell = "$year-$month_padded-$currentDayRel"; // 当前单元格的日期字符串
        $cell_class = '';
        $cell_content = '';
        // 明确区分过去、今天和未来
        if ($date_cell < $today_string) {
            // 过去的日期
            $cell_class = 'past';
            $cell_content = "<h4>$currentDay</h4> <button class='btn btn-danger btn-xs' disabled>N/A</button>";
        } elseif ($date_cell == $today_string) {
            // 今天
            $cell_class = 'today';
            $cell_content = "<h4>$currentDay</h4> <a href='book.php?date=" . $date_cell . "' class='btn btn-success btn-xs'>Book</a>";
        } else {
            // 未来的日期
            $cell_class = 'future';
            $cell_content = "<h4>$currentDay</h4> <a href='book.php?date=" . $date_cell . "' class='btn btn-success btn-xs'>Book</a>";
        }
        $calendar .= "<td class='$cell_class'>$cell_content</td>";
        // 递增计数器
        $currentDay++;
        $dayOfWeek++;
    }
    // 填充月末的空单元格,如果最后一周没有填满
    if ($dayOfWeek != 7) {
        $remainingDays = 7 - $dayOfWeek;
        for ($l = 0; $l < $remainingDays; $l++) {
            $calendar .= "<td class='empty'></td>";
        }
    }
    $calendar .= "</tr>";
    $calendar .= "</table>";
    return $calendar;
}
// 示例调用 (假设当前日期是 2021年12月1日)
// echo build_calendar(12, 2021); 
// 若要显示当前月份,可以这样调用:
// echo build_calendar(date('m'), date('Y'));
?>通过采用DateTime对象来统一管理“当前日期”的引用,并优化日期状态的判断逻辑,我们可以有效地解决PHP日历中当前日期高亮不准确或不更新的问题。这种方法不仅提升了代码的健壮性和可维护性,也确保了日历功能能够准确、动态地响应时间变化,为用户提供一个直观且可靠的日程视图。
以上就是PHP日历中当前日期高亮与更新的实现指南的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号