php简单实现日历

版权声明:我是锋子@FENGZI https://blog.csdn.net/weixin_37546664/article/details/74019021

使用php简单的做了一个日历,对php的时间函数又有了一个全新的提升认识!


实现日历其实也比较简单,主要有几步:

1. 首先调整好一个要显示的基本样式

2. 获取每个月第一天星期几(主要是为了显示日期前面空格填充)

3. 使用mktime()根据给出的时间参数获取对应的时间戳,然后转换成具体的年和月...


代码如下:

1. 首先显示星期(日,一,二,三,四,五,六); 这个很好弄,定义一个数组,使用循环输出就行了

 
   #获取周日到周六
    private function weeks()
    {
        $arr = array('日', '一', '二', '三', '四', '五', '六');

        echo "<tr>";
            for ($i = 0; $i < count($arr); ++$i) {
                    echo "<td>" .$arr[$i]. "</td>";
            }
        echo "</tr>";
    }


2. 然后初始化年和月; 创建一个构造函数初始化当前的年和月,和每月第一天的周几和每个月具体的天数

 

    private $year;          // 年
    private $month;         // 月
    private $current_week;  // 每月份第一天的周几
    private $month_day;     // 月份的天数

    public function __construct()
    {
        date_default_timezone_set("Asia/Shanghai");

        $this->year  = isset($_GET['year'])  ?  $_GET['year']  : date("Y");
        $this->month = isset($_GET['month']) ?  $_GET['month'] : date("m");
        $this->current_week = date("w", mktime(0, 0, 0, $this->month, 1, $this->year) );
        $this->month_day    = date("t", mktime(0, 0, 0, $this->month, 1, $this->year));
    }

小解: w:表示星期中的第几天; t: 表示每个月的实际总天数


3. 开始循环天数,首先确定月份第一天是周几后,输出空格(比如一号是周2,就输出两个空格,依次类推...)


 #循环获取天数
   private function days()
   {
        echo "<tr>";

            //输出空格
            for ($b = 0; $b < $this->current_week; ++$b) {
                echo "<td>&nbsp;</td>";
            }

           //输出天数
            for ($a = 1; $a <= $this->month_day; ++$a) {
                $b++;

                if ($a == date("d")) {
                    echo "<td style='background:blue;'>" . $a . "</td>";
                } else {
                    echo "<td>" . $a . "</td>";
                }
                if ($b%7 === 0) {
                    echo "<tr></tr>";
                }

            }
        echo "</tr>";
   }

最后一个初步的日历显示出来了,效果如下:

 


4. 接着来:显示出当前的年和月;就是把当前的年和月输出即可,然后在年和月上面增加一个超链接(实际操作时ajax异步来处理的)然后点击就进行年和月的切换:

 

   //点击改变年和月
    private function changedate()
    {
        echo "<a href='?".$this->changeYear($this->year, $this->month)."'> <<< </a> ";
        echo "<a href='?".$this->changeMonth($this->year, $this->month)."'> << </a> ";
        echo $this->year ." ". $this->month;
        echo "<a href='?".$this->changeMonthAdd($this->year, $this->month)."'> >> </a>";
        echo " <a href='?".$this->changeYearAdd($this->year, $this->month)."'> >>> </a>";
    }


在超链接上我是学习别人使用的方法形式。(年份)具体方法如下:

   //改变年(减)
    private function changeYear($year, $month)
    {
        $year  = $year - 1;

        return "year=" . $year . "&month=" . $month;
    }

    //改变月份(减)
    private function changeMonth($year, $month)
    {
        if ($month == 1 || $month == "01") {
            $year = $year - 1;
            $month = 12;
        } else {
            $month--;
        }
        return "year=" . $year . "&month=" . $month;
    }

    //改变年(加)
    private function changeYearAdd($year, $month)
    {
        $year  = $year + 1;

        return "year=" . $year . "&month=" . $month;
    }

    //改变月份(加)
    private function changeMonthAdd($year, $month)
    {
        if ($month == 12) {
            $year = $year + 1;
            $month = 1;
        } else {
            $month++;
        }
        return "year=" . $year . "&month=" . $month;
    }

这里的实现使用了一个简单的小小算法:

  1.1 当年份是向后(减)的时候,对当前的年进行减一,然后通过链接以get的方式传递过去,在获取时,通过$_GET超全局数组来获取到传递过来的值,月份同样是如此操作的。

  1.2  当月份向后(减)的时候,月份总共12个月,当月份为一月份的时候,对年减一,然后月份为12份,相当于意思就是:年份减一,向后退了一年,月份是12月份。返过来月份相加时,年份加一,月份是一月份。

代码就是上面的四个方法。


整体代码如下:

<?php namespace Admin\Controller;

class IndexController extends \Think\Controller
{

    private $year;          //年
    private $month;         //月
    private $current_week;  //当前月第一天的周几
    private $month_day;     // 前月的天数

    public function __construct()
    {
        date_default_timezone_set("Asia/Shanghai");

        $this->year  = isset($_GET['year'])  ?  $_GET['year']  : date("Y");
        $this->month = isset($_GET['month']) ?  $_GET['month'] : date("m");
        $this->current_week = date("w", mktime(0, 0, 0, $this->month, 1, $this->year) );
        $this->month_day    = date("t", mktime(0, 0, 0, $this->month, 1, $this->year));
    }


    public function index()
    {
        $this->outputs();
    }


    #输出
    private function outputs()
    {
        echo "<table border='1'>";
            $this->changedate();
            $this->weeks();
            $this->days();
        echo "</table>";
    }


    #获取周日到周六
    private function weeks()
    {
        $arr = array('日', '一', '二', '三', '四', '五', '六');

        echo "<tr>";
            for ($i = 0; $i < count($arr); ++$i) {
                    echo "<td>" .$arr[$i]. "</td>";
            }
        echo "</tr>";
    }


    #循环获取天数
   private function days()
   {
        echo "<tr>";

            for ($b = 0; $b < $this->current_week; ++$b) {
                echo "<td> </td>";
            }


            for ($a = 1; $a <= $this->month_day; ++$a) {
                $b++;

                if ($a == date("d")) {
                    echo "<td style='background:blue;'>" . $a . "</td>";
                } else {
                    echo "<td>" . $a . "</td>";
                }
                if ($b%7 === 0) {
                    echo "<tr></tr>";
                }

            }
        echo "</tr>";
   }

   //改变年
    private function changeYear($year, $month)
    {
        $year  = $year - 1;

        return "year=" . $year . "&month=" . $month;
    }

    //改变月份
    private function changeMonth($year, $month)
    {
        if ($month == 1 || $month == "01") {
            $year = $year - 1;
            $month = 12;
        } else {
            $month--;
        }
        return "year=" . $year . "&month=" . $month;
    }

    //改变年
    private function changeYearAdd($year, $month)
    {
        $year  = $year + 1;

        return "year=" . $year . "&month=" . $month;
    }

    //改变月份
    private function changeMonthAdd($year, $month)
    {
        if ($month == 12) {
            $year = $year + 1;
            $month = 1;
        } else {
            $month++;
        }
        return "year=" . $year . "&month=" . $month;
    }

   //点击改变年和月
    private function changedate()
    {
        echo "<a href='?".$this->changeYear($this->year, $this->month)."'> <<< </a> ";
        echo "<a href='?".$this->changeMonth($this->year, $this->month)."'> << </a> ";
        echo $this->year ." ". $this->month;
        echo "<a href='?".$this->changeMonthAdd($this->year, $this->month)."'> >> </a>";
        echo " <a href='?".$this->changeYearAdd($this->year, $this->month)."'> >>> </a>";
    }

}

最终效果:

 

 

样式很丑,没有去调整,整个流程走了一遍,主要是为了学习。相互学习,相互交流;

欢迎一起学习:微信号:zhaoyufengxixi  QQ号:1526607040

 
 

猜你喜欢

转载自blog.csdn.net/weixin_37546664/article/details/74019021
今日推荐