php简单实现日历

来源:互联网 发布:windows 桌面文件管理 编辑:程序博客网 时间:2024/06/06 00:04

使用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