PHP生成的日历

日程表的前端程序的核心是,通过PHP脚本生成一个当前日期的日历表格,再通过遍历数据中的消息事件,在有事件提醒的日期生成一个有"event"标识的链接,单击该链接就可以异步将对应的提醒信息显示在日历表格的下方。

PHP生成的日历

PHP生成日历是这个模块逻辑上最复杂的部分,下面来看如何生成一个标准的日历。日历展示的部分是将星期和日期通过一张二维表格输出到浏览器中的。日历表格的形式如图9.6所示。

 
图9.6  日历表格样式

现在以2010年6月14日为例说明。6月份共有30天,在这个日历表中共5行,首先需要确定当前所在的日期(当然也可以指定一个日期),比如14日,通过表格可以知道它在第3行对应星期一那列(第3周)。通常每个月第1天不是在表格开始的位置,位置并不固定,同样不固定的还有每个月的周数,有时候是4周,有时候是5周。这样,想要完成这个日历表格就需要确定一些基础的日期变量,下面具体来看需要设定的基础变量。

PHP提供了date()函数,该函数提供了丰富的日期处理功能。现在需要获得的数据有两个,第一个是当月的总天数;第二个是该月的第一天所在星期中的第几天,数字表示0(表示星期天)到6(表示星期六)。通过date()函数可以很容易获得上面的数据。

  1. <?php 
  2. //date()函数的基本用法  
  3. $year = date('Y');      //获得年份,例如2006  
  4. $month = date('n');     //获得月份,例如04  
  5. $day = date('j');       //获得日期,例如3  
  6. ?> 

 

通过mktime()函数和date()函数获得当月的总天数。

  1. //获得当月的总天数  
  2. $daysInMonth = date("t",mktime(0,0,0,$month,1,$year));  

 

同样是组合使用mktime()函数和date()函数,获得该月的第一天所在星期中的第几天,数字表示0(表示星期天)到6(表示星期六)。

  1. //获得每个月的第一天,例如4  
  2. $firstDay = date("w", mktime(0,0,0,$month,1,$year));  

现在重新来观察下这个日历表格,我们发现,表格中的值是从1到x(当月的总天数)。我们可以形象地通过一个坐标来表示每一个位置(x,y),表格的起始位置是(0,0),结束位置是(5,4),当月第一天的起始位置是(0,3)。现在来创建一个二维数组来存储对应的日期。

(1)需要获得表格的数目。

  1. //计算数组中的日历表格数  
  2. $tempDays = $firstDay + $daysInMonth;  

 

(2)需要算出该月一共有几周(即表格的行数)。

  1. //获得表格行数  
  2. $weeksInMonth = ceil($tempDays/7);  

 

(3)在获得行数的变量之后,创建一个二维数组用来存放日期信息,代码如下:

  1. <?php 
  2. for($j=0;$j&lt;$weeksInMonth;$j++)   
  3. {  
  4.     for($i=0;$i&lt;7 
  5.     ;$i++)   
  6.     {  
  7.         $counter ++;  
  8.         $week [$j] [$i] = $counter;  
  9.     }  
  10. }  
  11. ?> 

 

(4)细心的读者可能发现,上面的代码其实是一个雏型,因为它处理出来的数据并没有过滤那些空白的表格单元。下面来继续改造下这段代码,加入过滤和构造的部分。改造后的代码如下:

  1. <?php 
  2. //创建日期二维数组  
  3. for($j = 0; $j < $weeksInMonth; $j ++) {  
  4.     for($i = 0; $i < 7; $i ++) {  
  5.         $counter ++;  
  6.         $week [$j] [$i] = $counter;  
  7.         //日期偏移量  
  8.         $week [$j] [$i] -= $firstDay;  
  9.         if (($week [$j] [$i] < 1) || ($week [$j] [$i] > $daysInMonth)) {  
  10.             $week [$j] [$i] = "";  
  11.         }  
  12.     }  
  13. }  
  14. ?> 

 

(5)在获得正确的二维数组之后,就可以通过foreach()函数将存储的日期信息遍历出来,同时插入HTML标签创建日期,代码如下:

  1. <?php 
  2. $year = date ( 'Y' );   //获得年份, 例如: 2006  
  3. $month = date ( 'n' );  //获得月份, 例如: 04  
  4. $day = date ( 'j' );    //获得日期, 例如: 3  
  5. $firstDay = date ( "w", mktime ( 0, 0, 0, $month, 1, $year ) );  
  6.                                         //获得当月第一天  
  7. $daysInMonth = date ( "t", mktime ( 0, 0, 0, $month, 1, $year ) );  
  8.                                         //获得当月的总天数  
  9. //echo $daysInMonth;  
  10. $tempDays = $firstDay + $daysInMonth;   //计算数组中的日历表格数  
  11. $weeksInMonth = ceil ( $tempDays/7 );   //算出该月一共有几周(即表格的行数)  
  12. //创建一个二维数组  
  13. for($j = 0; $j < $weeksInMonth; $j ++) {  
  14.     for($i = 0; $i < 7; $i ++) {  
  15.         $counter ++;  
  16.         $week [$j] [$i] = $counter;  
  17.         //offset the days  
  18.         $week [$j] [$i] -= $firstDay;  
  19.         if (($week [$j] [$i] < 1) || ($week [$j] [$i] > $daysInMonth)) {  
  20.             $week [$j] [$i] = "";  
  21.         }  
  22.     }  
  23. }  
  24. ?> 
  25. <script type="text/JavaScript" src="calendar.js"></script> 
  26. <table width="400" border="1" cellpadding="2" cellspacing="2"> 
  27.     <tr> 
  28.         <th colspan='7'> 
  29.             <?php 
  30.             echo date ( 'M', mktime ( 0, 0, 0, $month, 1, $year ) ) . ' ' .             $year;  
  31.             ?> 
  32.         </th> 
  33.     </tr> 
  34.     <tr> 
  35.         <th>Sun</th> 
  36.         <th>Mon</th> 
  37.         <th>Tue</th> 
  38.         <th>Wed</th> 
  39.         <th>Thur</th> 
  40.         <th>Fri</th> 
  41.         <th>Sat</th> 
  42.     </tr> 
  43. <?php 
  44. foreach ( $week as $key => $val ) {  
  45.     echo "<tr>";  
  46.     for($i = 0; $i < 7; $i ++) {  
  47.         echo "<td align='center'>" . $val [$i] . "</td>";  
  48.     }  
  49.     echo "</tr>";  
  50. }  
  51. ?> 

 

(6)在浏览器中运行上面的代码,得到一个完整的日历表格,效果如图9.7所示。

 

 
图9.7  PHP生成日历
posted @ 2013-04-02 23:23  losesea  阅读(819)  评论(0编辑  收藏  举报