说到对日期和时间的处理,就一定要介绍一下日历程序的编写,大多数读者可能都会认为日历的作用只是为了在页面上显示当前的日期,其实不然,日历在我们的开发中有着更重要的作用。例如,我们开发一个“记事本”就需要通过日历设定日期,另外在一些系统中需要按日期去安排任务也需要用到日历等等。
本节的示例中涉及的日期和时间函数并不是很多,都是前面介绍的,主要是通过编写一个日历类来巩固一下前面介绍的面向对象,以及时间函数应用,同时示例中涉及到一些前端知识,感兴趣的读者可以阅读本站提供的 HTML 和 CSS 教程。
完整的示例代码如下所示:
- <?php
- class Calendar{
- private $year, $month, $start_week, $days;
- /**
- * 构造方法,用来初始化一些日期属性
- */
- function __construct(){
- $this->year = isset($_GET['year'])?$_GET['year']:date('Y');
- $this->month = isset($_GET['month'])?$_GET['month']:date('m');
- $this->start_week = date('w', mktime(0, 0, 0, $this->month, 1, $this->year));
- $this->days = date('t', mktime(0, 0, 0, $this->month, 1, $this->year));
- }
- /**
- * 魔术方法,用来打印整个日历
- * @return string [日历的html代码]
- */
- function __toString(){
- $output = '';
- $output = '<table align="center">';
- $output .= $this->changeDate();
- $output .= $this->weeksList();
- $output .= $this->daysList();
- $output .= '</table>';
- return $output;
- }
- /**
- * 输出周列表
- * @return [string] [html 代码]
- */
- private function weeksList($output=''){
- $week = array('日','一','二','三','四','五','六');
- $output .= '<tr>';
- for ($i=0; $i < count($week); $i++) {
- $output .= '<th class="fonth">'.$week[$i].'</th>';
- }
- $output .= '</tr>';
- return $output;
- }
- /**
- * 输出日期列表
- * @return [string]
- */
- private function daysList($output=''){
- $output .= '<tr>';
- for ($i=0; $i < $this->start_week; $i++) {
- $output .= '<td> </td>';
- }
- for ($j=1; $j <= $this->days; $j++) {
- $i++;
- if($j == date('d') && $this->year == date('Y') && $this->month == date('m')){
- $output .= '<td class="fontb">'.$j.'</td>';
- }else{
- $output .= '<td>'.$j.'</td>';
- }
- if($i%7 == 0) $output .= '</tr><tr>';
- }
- while($i%7 !== 0){
- $output .= '<td> </td>';
- $i++;
- }
- $output .= '</tr>';
- return $output;
- }
- /**
- * 处理上一年的数据
- * @param [type] $year [年份]
- * @param [type] $month [月份]
- * @return [type] [description]
- */
- private function prevYear($year, $month){
- $year -= 1;
- if($year < 1970) $year = 1970;
- return "year=$year&month=$month";
- }
- /**
- * 处理上一月的数据
- * @param [type] $year [年份]
- * @param [type] $month [月份]
- * @return [type] [description]
- */
- private function prevMonth($year, $month){
- if($month == 1){
- $year -= 1;
- if($year < 1970) $year = 1970;
- $month = 12;
- }else{
- $month--;
- }
- return "year=$year&month=$month";
- }
- /**
- * 处理下一年的数据
- * @param [type] $year [年份]
- * @param [type] $month [月份]
- * @return [type] [description]
- */
- private function nextYear($year, $month){
- $year += 1;
- if($year > 2038) $year = 2038;
- return "year=$year&month=$month";
- }
- /**
- * 处理下一月的数据
- * @param [type] $year [年份]
- * @param [type] $month [月份]
- * @return [type] [description]
- */
- private function nextMonth($year, $month){
- if($month == 12){
- $year --;
- if($year > 2038) $year = 2038;
- $month = 1;
- }else{
- $month++;
- }
- return "year=$year&month=$month";
- }
- /**
- * 调整年份和月份
- * @param string $output [html代码]
- * @param string $url
- * @return [type]
- */
- private function changeDate($output='', $url='index.php'){
- $output .= '<tr>';
- $output .= '<td><a href="'.$url.'?'.$this->prevYear($this->year, $this->month).'">'.'<<'.'</a></td>';
- $output .= '<td><a href="'.$url.'?'.$this->prevMonth($this->year, $this->month).'">'.'<'.'</a></td>';
- $output .= '<td colspan="3">';
- $output .= '<form>';
- $output .= '<select name="year" onchange="window.location=\''.$url.'?year=\'+this.options[selectedIndex].value+\'&month='.$this->month.'\'">';
- for ($i=1970; $i <=2038; $i++) {
- $selected = ($i == $this->year)?'selected="selected"':'';
- $output .= '<option value="'.$i.'" '.$selected.'>'.$i.'</option>';
- }
- $output .= '</select>';
- $output .= '<select name="month" onchange="window.location=\''.$url.'?year='.$this->year.'&month=\'+this.options[selectedIndex].value">';
- for ($j=1; $j <=12; $j++) {
- $selected = ($j == $this->month)?'selected="selected"':'';
- $output .= '<option value="'.$j.'" '.$selected.'>'.$j.'</option>';
- }
- $output .= '</select>';
- $output .= '</form>';
- $output .= '</td>';
- $output .= '<td><a href="'.$url.'?'.$this->nextMonth($this->year, $this->month).'">'.'>'.'</a></td>';
- $output .= '<td><a href="'.$url.'?'.$this->nextYear($this->year, $this->month).'">'.'>>'.'</a></td>';
- $output .= '</tr>';
- return $output;
- }
- }
- ?>
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>城东书院(PHP实现日历)</title>
- <style>
- table{
- border: 1px solid #ccc;
- }
- .fontb{
- color: white;
- background: blue;
- }
- th{
- width: 30px;
- }
- td,th{
- height:30px;
- text-align: center;
- }
- form{
- margin: 0px;
- padding: 0px;
- }
- </style>
- </head>
- <body>
- <?php
- $calendar = new Calendar;
- echo $calendar;
- ?>
- </body>
- </html>
运行结果如下图所示: