一、设置时区

首先设置我们的时区,一个日历的制作肯定要有时间的嘛

如下:

date_default_timezone_set("PRC"); //设置时区

这段代码中PRC是中国的意思,这段代码是把 默认时区设置成了中国标准时间

二、以表格形式输出日历

        echo "<style>table{margin:0 auto}td{border:1px solid black}</style>";
        $w_arr=array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
        echo "<table><tr>";
        for($i=0;$i<count($w_arr);$i++){
            echo "<td>$w_arr[$i]</td>";
        }

输出结果:

 先输出表格样式,让后创建一个名为 $w_arr 的星期数组,在用 for循环 输出表格。

为什么星期日会在第一个格子呢?因为我们要用 date()函数 获取某天是星期几,用到的是这个函数里面的 “w",date("w") 又表示星期几的数字,如:星期日是0,星期六是6......

然后这个月的第一天就会从那个星期几开始。


然后定义一下我们的 年 月 日~

        $year = date("Y"); //本年度的年份 Y 为年份的四位数表达
        $month = date("m"); //本月的月份 m 月份的数字表示 (01~12)
        $day = date("j"); //获取当天的天数 j 为不带前导零 如:(1~12) 为了日历美观

让后获取这个月第一天是星期几

$fday = date("w", mktime(0, 0, 0, $month, 1, $year)); 

结果:

 因为我们获取的date("Y”);date("m");是本年本月份的,然后现在是4月份,我们输出了一下这个

$fday的值显示为 “ 5 (星期五) “,而这段代码的解释呢就是:

先用 mktime() 获取 今年现在这个月份一号的时间戳,当然这个$month$year中间的 ”1“ 也可以去掉,因为它本来就是获取这个月份第一天是星期几,但这里为了严谨一点,然后用 date("w"); 将这个月份第一天转换成星期几的数字形式。

$num = $fday + date("t", mktime(0, 0, 0, $month, 1, $year)); //计算星期几加上当月的天数 共需要多少个格子

然后定义一个变量来计一共需要多少个表格,为什么呢?如下图所示

这下就简单明了了,上面用的获取第一天为星期几就排上用场了,$fday计的值为5,然后可以理解为就有五个空格子,如果大于等于这个第一天的值的时候开始输出日期:

for ($i = 0; $i < $num; $i++){
    $date = $i+1;//设置输出的日期变量
    //输出所有的格子,最大格子数为$num;
    if ($i % 7 == 0) {
                echo "<tr>"; //加个判断,日历的一行有7个格子
            }
    echo "<td>";//然后输出格子
        if ($i >= $wd) { //这里开始判断,日历第一天的开始
                if ($date == $day && $month == date("n") && $year == date("Y")) {
                    //如果恰好是系统当天的日期则将当天日期设置为红色并加粗
                    echo "<b><font color='orange'>" . $day . "</font></b>";
                } else {
                    echo $date; //输出日期
                }
                echo "</td>";//如果以上都没有就是空格子
}

但是发现结果是这样的:

它的第一天是从6开始的,这是为什么呢? 

于是乎开始苦逼的寻找bug了 T_T

然后发现了问题所在!!!

因为for循环里面的$date = $i+1;随着 i++ 它 $date 的值会不断自增,到了符合if ($i >= $fday)的时候开始输出,此时的 $date 是大于这个 if 判断语句的,但他的值却不再是 1 ,然后这里应该是忘记前面要减去的五个空格 ,于是修改了这段代码:$date = $i+1-$fday; 然后这个小bug被解决了!

最后放上完整的php日历代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <?php
    echo "<style>table{margin:0 auto}td{border:1px solid black}</style>";
    $w_arr = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
    echo "<table><tr>";
    for ($i = 0; $i < count($w_arr); $i++) {
        echo "<td>$w_arr[$i]</td>";
    }
    echo "</td>";
    $year = date("Y"); //本年度的年份 Y 为年份的四位数表达
    $month = date("m"); //本月的月份 m 月份的数字表示 (01~12)
    $day = date("j"); //获取当天的天数 j 为不带前导零 如:(1~12) 为了日历美观
    $fday = date("w", mktime(0, 0, 0, $month, 1, $year)); //获取第一天是星期几
    $num = $fday + date("t", mktime(0, 0, 0, $month, 1, $year)); //计算星期几加上当月的天数 共需要多少个格子
    for ($i = 0; $i < $num; $i++) {
        $date = $i + 1 - $fday;
        if ($i % 7 == 0) {
            echo "<tr align=center>"; //一行的开始
        }
        echo "<td>";
        if ($i >= $fday) {
            if ($date == $day && $month == date("n") && $year == date("Y")) {
                //如果恰好是系统当天的日期则将当天日期设置为红色并加粗
                echo "<b><font color='orange'>" . $day . "</font></b>";
            } else {
                echo $date; //输出日期
            }
            echo "</td>";
        }
    }
    ?>
</body>

</html>

总结

菜要多练......

Logo

助力合肥开发者学习交流的技术社区,不定期举办线上线下活动,欢迎大家的加入

更多推荐