程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 教大家制作簡單的php日歷

教大家制作簡單的php日歷

編輯:PHP綜合

最近的一個項目中,需要將數據用日歷方式顯示,網上有很多的JS插件,後面為了自己能有更大的控制權,決定自己制作一個日歷顯示。如下圖所示:

一、計算數據
1、new一個Calendar類

2、初始化兩個下拉框中的數據,年份與月份

3、初始化要搜索的年份和月份

4、計算得出日歷中每一天的數據信息,包括css、天數

<?php
 require_once 'calendar.php';
 $util = new Calendar();
 $years = array(2012, 2013, 2014, 2015, 2016);//年份選擇自定義
 $months = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);//月份數組
 //獲取post的年份數據
 if(empty($_POST['ddlYear'])) {
  $year = date('Y');
 }else {
  $year = $_POST['ddlYear'];
 }
 //獲取post的月份數據
 if(empty($_POST['ddlMonth'])) {
  $month = date('n');
 }else {
  $month = $_POST['ddlMonth'];
 }

 $calendar = $util->threshold($year, $month);//獲取各個邊界值
 $caculate = $util->caculate($calendar);//計算日歷的天數與樣式
 $draws = $util->draw($caculate);//畫表格,設置table中的tr與td
?>

二、html展示
1、休息天的背景色是不同的,不是當前搜索年月的天數字體顏色也是不同的

2、div中做初始化年份與月份的下拉框的操作,並選中當前要搜索的年月

3、數據已計算好,哪個td屬於哪個tr也已做好,直接將table打印出來即可
  

<div style="padding:20px">
  <select name="ddlYear">
  <?php foreach($years as $data) {?>
   <option value="<?php echo $data?>" <?php if($year == $data) echo 'selected="selected"'?>><?php echo $data?></option>
  <?php }?>
  </select>
  <select name="ddlMonth">
  <?php foreach($months as $data) {?>
   <option value="<?php echo $data?>" <?php if($month == $data) echo 'selected="selected"'?>><?php echo $data?></option>
  <?php }?>
  </select>
  <input type="submit" value="修改"/>
 </div>
 <table width="100%" cellspacing="0" class="table_calendar">
  <thead class="f14">
    <tr>
     <td width="16%">日</td>
     <td width="14%">一</td>
     <td width="14%">二</td>
     <td width="14%">三</td>
     <td width="14%">四</td>
     <td width="14%">五</td>
     <td width="14%">六</td>
    </tr>
  </thead>
  <tbody class="f14">
   <?php foreach($draws as $draw) {?>
    <tr>
    <?php foreach($draw as $date) {?>
     <td class="<?php echo $date['tdclass']?>">
      <p class="<?php echo $date['pclass']?>"><?php echo $date['day']?></p>
     </td>
    <?php }?> 
    </tr>
   <?php }?>
  </tbody>
 </table>

三、Calendar類
1、threshold方法,生成日歷的各個邊界值

  1)計算這個月總天數

  2)計算這個月第一天與最後一天,各是星期幾

  3)計算日歷中的第一個日期與最後一個日期
  

/**
  * @deprecated 生成日歷的各個邊界值
  * @param string $year
  * @param string $month
  * @return array
  */
 function threshold($year, $month) {
  $firstDay = mktime(0, 0, 0, $month, 1, $year);
  $lastDay = strtotime('+1 month -1 day', $firstDay);
  //取得天數 
  $days = date("t", $firstDay);
  //取得第一天是星期幾
  $firstDayOfWeek = date("N", $firstDay);
  //獲得最後一天是星期幾
  $lastDayOfWeek = date('N', $lastDay);
  
  //上一個月最後一天
  $lastMonthDate = strtotime('-1 day', $firstDay);
  $lastMonthOfLastDay = date('d', $lastMonthDate);
  //下一個月第一天
  $nextMonthDate = strtotime('+1 day', $lastDay);
  $nextMonthOfFirstDay = strtotime('+1 day', $lastDay);
  
  //日歷的第一個日期
  if($firstDayOfWeek == 7)
   $firstDate = $firstDay;
  else 
   $firstDate = strtotime('-'. $firstDayOfWeek .' day', $firstDay);
  //日歷的最後一個日期
  if($lastDayOfWeek == 6)
   $lastDate = $lastDay;
  elseif($lastDayOfWeek == 7) 
   $lastDate = strtotime('+6 day', $lastDay);
  else
   $lastDate = strtotime('+'.(6-$lastDayOfWeek).' day', $lastDay);
  
  return array(
    'days' => $days, 
    'firstDayOfWeek' => $firstDayOfWeek, 
    'lastDayOfWeek' => $lastDayOfWeek,
    'lastMonthOfLastDay' => $lastMonthOfLastDay,
    'firstDate' => $firstDate,
    'lastDate' => $lastDate,
    'year' => $year,
    'month' => $month
  );
 }

2、caculate方法,計算日歷的天數與樣式

  1)將上個月的天數計算出來,本月第一天的星期不是星期天的話,就需要根據上個月的最後一天計算

  2)將本月的天數遍歷出來,如果是休息天就加上特殊的css樣式

  3)將下個月的天數計算出來,分三種情況,星期日、星期六和工作日
  

/**
  * @author Pwstrick
   * @param array $calendar 通過threshold方法計算後的數據
  * @deprecated 計算日歷的天數與樣式
  */
 function caculate($calendar) {
  $days = $calendar['days'];
  $firstDayOfWeek = $calendar['firstDayOfWeek'];//本月第一天的星期
  $lastDayOfWeek = $calendar['lastDayOfWeek'];//本月最後一天的星期
  $lastMonthOfLastDay = $calendar['lastMonthOfLastDay'];//上個月的最後一天
  $year = $calendar['year'];
  $month = $calendar['month'];
  
  $dates = array();
  if($firstDayOfWeek != 7) {
   $lastDays = array();
   $current = $lastMonthOfLastDay;//上個月的最後一天
   for ($i = 0; $i < $firstDayOfWeek; $i++) {
    array_push($lastDays, $current);//添加上一個月的日期天數
    $current--;
   }
   $lastDays = array_reverse($lastDays);//反序
   foreach ($lastDays as $index => $day) {
    array_push($dates, array('day' => $day, 'tdclass' => ($index ==0 ?'rest':''), 'pclass' => 'outter'));
   }
  }
  
  //本月日歷信息
  for ($i = 1; $i <= $days; $i++) {
   $isRest = $this->_checkIsRest($year, $month, $i);
   //判斷是否是休息天
   array_push($dates, array('day' => $i, 'tdclass' => ($isRest ?'rest':''), 'pclass' => ''));
  }
  
  //下月日歷信息
  if($lastDayOfWeek == 7) {//最後一天是星期日
   $length = 6;
  }
  elseif($lastDayOfWeek == 6) {//最後一天是星期六
   $length = 0;
  }else {
   $length = 6 - $lastDayOfWeek;
  }
  for ($i = 1; $i <= $length; $i++) {
   array_push($dates, array('day' => $i, 'tdclass' => ($i==$length ?'rest':''), 'pclass' => 'outter'));
  }
  
  return $dates;
 }

3、draw方法,畫表格,設置table中的tr與td

  1)數據將要用table標簽來顯示,所以這裡要將各個tr下面的td排列好

  2)$index % 7 == 0 計算表格每行的第一列

  3)$index % 7 == 6 || $index == ($length-1) 計算每行的最後一列,或$caculate的最後一個數據

  4)將中間行添加到$tr中,就是每一行的array

 /**
  * @author Pwstrick
  * @param array $caculate 通過caculate方法計算後的數據
  * @deprecated 畫表格,設置table中的tr與td
  */
 function draw($caculate) {
  $tr = array();
  $length = count($caculate);
  $result = array();
  foreach ($caculate as $index => $date) {
   if($index % 7 == 0) {//第一列
    $tr = array($date);
   }elseif($index % 7 == 6 || $index == ($length-1)) {
    array_push($tr, $date);
    array_push($result, $tr);//添加到返回的數據中
    $tr = array();//清空數組列表
   }else {
    array_push($tr, $date);
   }
  }
  return $result;
 }

通過本文大家應該知道日歷制作的方法了,那就趁熱打鐵,做一個屬於自己日歷。

附源碼:教大家制作簡單的php日歷

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved