找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1847|回复: 0
打印 上一主题 下一主题

一个比较不错的PHP日历类分享

[复制链接]

2588

主题

2588

帖子

7694

积分

论坛元老

Rank: 8Rank: 8

积分
7694
跳转到指定楼层
楼主
发表于 2018-2-14 05:52:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            说到对时期和时间的处理,就一定要介绍一下日历程序的编写。但一提起编写日历,大多数人都会认为日历的作用只是为了在页上显示当前的日期,其实日历在我们的开发中有更重要的作用。例如我们开发一个“记事本”就需要通过日历设定日期,还有一些系统中需要按日期去排任务,也需要日历,等等。本例涉及的日期和时间函数并不是很多,都是前面介绍的内容,主要是通过一个日历类的编写,巩固一下前面介绍过的面向对象的语法知识,以及时间函数应用,最主要的是可以提升初学者的思维逻辑和程序设计能力。将日历类Calendar声明在文件calendar.class.php中,代码如下所示:

year = isset($_GET["year"]) ? $_GET["year"] : date("Y");
            //如果用户没有设置月份数,则使用当前系统时间的月份
            $this->month = isset($_GET["month"]) ? $_GET["month"] : date("m");
            //通过具体的年份和月份,利用date()函数的w参数获取当月第一天对应的是周几
            $this->start_weekday = date("w",mktime(0,0,0,$this->month,1,$this->year));
            //通过具体的年份和月份,利用date()函数的t参数获取当月的天数
            $this->days = date("t",mktime(0,0,0,$this->month,1,$this->year));
        }

        //魔术方法用于打印整个日历
        function __toString(){
            $out .='
';
            $out .=$this->chageDate();        //调用内部私有方法用于用户自己设置日期
            $out .=$this->weeksList();        //调用内部私有方法打印周列表
            $out .=$this->daysList();         //调用内部私有方法打印日列表
            $out .='
';

            return $out;          //返回整个日历输需要的全部字符串
        }

        //内部调用的私有方法,用于输出周列表
        private function weeksList(){
            $week = array('日','一','二','三','四','五','六');
            $out .= '[tr]';
            for ($i = 0; $i'.$week[$i].'[/td]';         //第一行以表格[td]输出周列表
            $out .= '[/tr]';
            return $out;          //返回周列表字符串
        }

        //内部调用的私有方法,用于输出周列表
        private function daysList(){
            $out .= '[tr]';
            //输出空格(当前一月第一天前面要空出来)
            for ($j = 0; $jstart_weekday; $j++)
                  $out .= '[td] [/td]';

            //将当月的所有日期循环遍历出来,如果是当前日期,为其设置深色背景
            for ($k = 1; $kdays; $k++){
                $j++;

                if ($k == date('d')){
                     $out .= '[td]'.$k.'[/td]';
                }else {
                     $out .='[td]'.$k.'[/td]';
                }

                if ($j%7 == 0)                   //每输出7个日期,就换一行
                     $out .= '[/tr][tr]';        //输出行结束和下一行开始
            }

            //遍历完日期后,将后面用空格补齐
            while ($j%7 !== 0){                    
                $out .= '[td] [/td]';
                $j++;
            }

            $out .= '[/tr]';
            return $out;                      //返回当月日期列表
        }

        //内部调用的私有方法,用于处理当前年份的上一年需要的数据
        private function prevYear($year,$month){
            $year = $year-1;          //上一年是当前年减1

            if($year  2038)          //年份设置最大值是2038年
                    $year =2038;

            return "year={$year}&month={$month}";        //返回最终的年份和月份设置参数
        }

        //内部调用的私有方法,用于处理当前月份的下一月份需要的数据
        private function nextMonth($year,$month){

            if ($month == 12){
                $year++;         

                if($year > 2038)         //年份设置最大值是2038年
                    $year =2038;
                $month = 1;           //如果是1月,上一月就是上一年的最后一月
            }else {
                    $month++;              //上一月份是当前月减1
            }
            return "year={$year}&month={$month}";        //返回最终的年份和月份设置参数
        }

        //内部调用的私有方法,用于用户操作去调整年份和月份的设置
        private function chageDate($url="index.php"){
            $out .= '[tr]';
            $out .= '[td][url='.$url.'?'.$this->prevYear($this->year,$this->month).']'.'prevMonth($this->year,$this->month).']'.'';
            $out .= 'month.'\'">';
            for ($sy=1970; $syyear) ? "selected" : "";
                $out .= ''.$sy.'';
            }
            $out .= '';
            $out .= 'year.'&month=\'+this.options[selectedIndex].value">';
            for ($sm=1; $smmonth) ? "selected" : "";
                $out .= ''.$sm.'';
            }
            $out .= '';
            $out .= '';
            $out .= '[/td]';

            $out .= '[td][url='.$url.'?'.$this->nextYear($this->year,$this->month).']'.'>>'.'[/url][/td]';
            $out .= '[td][url='.$url.'?'.$this->nextMonth($this->year,$this->month).']'.'>>'.'[/url][/td]';
            $out .= '[/tr]';
            return $out;                //返回日期表单
        }
    }
?>
本例将一个日历程序按功能拆分(周列表部分、日期列表部分、设置日期部分,以及上一年、下一年、上一月和下一月的设置部分)并封装在一个日历类中。有了日历类,我们还需要再编写一个主程序去加载并输出日历,在主程序中还需要先设置一下日历输出的样式,代码如下所示:
   
        恩聪PHP日历示例
        
            table {border:1px solid #050;}
            .fontb {color:white; background:blue;}
            th{width:30px;}
            td,th{height:30px;text-align:center;}
            form{margin:0px; padding:0px;}
        
   
   
        
   

运行结果如图所示,默认显示当前系统日期。可以通过单击“>>”按钮设置下一年份,但设置的最大年份为2038年。也可以通过单击“”按钮设置上一个和下一个月份,如果当月为12月,则设置的下一个月份就为次年的1月,如果当月为1月,则设置上一个月份就为上一年的12月。如果需要快速定位到指定的年份和月份,还可通过下拉列表进行设置。
            
            
您可能感兴趣的文章:
  • php下实现农历日历的代码
  • php日历[测试通过]
  • PHP 简单日历实现代码
  • php+javascript的日历控件
  • php日历制作代码分享
  • Thinkphp模板中截取字符串函数简介
  • ThinkPHP多表联合查询的常用方法
  • ThinkPHP实现多数据库连接的解决方法
  • PHP实现的简单日历类
  • thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
  • PHP简单日历实现方法
  • php+mysql+jquery实现日历签到功能
  • 基于ThinkPHP实现的日历功能实例详解
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端