时时商务社区

标题: 一个比较不错的PHP日历类分享 [打印本页]

作者: qz234    时间: 2018-2-14 05:52

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




    欢迎光临 时时商务社区 (http://bbs.4435.cn/) Powered by Discuz! X3.2