PHP打印带有节假日的日历

// 以下接口每年更新一次,具体什么时候更新我也不知道,需等国务院发布
$res = file_get_contents("http://api.goseek.cn/Tools/holiday?date=20181010");
$res = json_decode($res,true);
var_dump($res);

表结构

CREATE TABLE `zt_calendar` (
  `year` char(4) DEFAULT NULL COMMENT '年',
  `month` char(2) DEFAULT NULL COMMENT '月',
  `day` char(2) DEFAULT NULL COMMENT '日',
  `wday` tinyint(2) unsigned DEFAULT NULL COMMENT '星期几',
  `type` tinyint(2) unsigned DEFAULT NULL COMMENT '(0-工作日,1-周末,2-节日)'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

代码

<?php
class jobModel extends model
{

    /* 通过API获取节假日日历 */
    public function getCalendarByApi($dates)
    {
        $returnArr = array();
        foreach ($dates as $val) {
            /* 判断节假日API */
            $res = file_get_contents("http://api.goseek.cn/Tools/holiday?date=".$val);
            $res = json_decode($res,true);

            $year  = substr($val, 0, 4);
            $month = substr($val, 4, 2);
            $day   = substr($val, 6, 2);

            $theDate = getdate(strtotime($year.'-'.$month.'-'.$day));

            $calendar->year     = $year;
            $calendar->month    = $month;
            $calendar->day      = $day;
            $calendar->wday     = $theDate['wday'] == 0 ? 7 : $theDate['wday'];
            $calendar->type     = $res['data'];
            $this->dao->insert('zt_calendar')->data($calendar)->exec();
            //这里自行替换成insert语句
            //insert into zt_calendar set `year` = '', `month` = '', `day` = '', `wday` = '', `type`  ='';

            $returnArr[$val] = $res['data'];
        }
        return $returnArr;
    }

    /* 通过数据库获取节假日日历 */
    public function getCalendar($date = 0)
    {
        $date = ($date == 0) ? date('Ymd', time()) : $date;
        $dateLen = strlen($date);

        if ($dateLen == '8') {
            $year = substr($date, 0, 4);
            $month = substr($date, 4, 2);
            $day = substr($date, 6, 2);

            //获取单行记录
            $datas = $this->dao->select('*')->from('zt_calendar')
                ->where('year')->eq($year)
                ->andWhere('month')->eq($month)
                ->andWhere('day')->eq($day)
                ->fetch();
            //SELECT * FROM zt_calendar WHERE `year` = '' AND `month` = '' and `day` = '';

            if (!$datas) {
                return $this->getCalendarByApi(array($date));
            } else {
                return array($date => $datas->type);
            }
        } else if ($dateLen == '6') {
            $year = substr($date, 0, 4);
            $month = substr($date, 4, 2);
            $returnArr = array();/* 要返回的数组 */

            $datas = $this->dao->select('*')->from('zt_calendar')
                ->where('year')->eq($year)
                ->andWhere('month')->eq($month)
                ->fetchAll();
            //SELECT * FROM zt_calendar WHERE `year` = '', `month` = '';            

            $days = array();/* 数据库已经存在的日期 */
            foreach ($datas as $val) {
                $days[] = strval($val->year.$val->month.$val->day);
                $returnArr[$val->year.$val->month.$val->day] = $val->type;
            }            

            // $days_all = range('01', '31');
            $days_all = array();/* 所有日期 */
            for ($i = 1; $i <= 9; $i++) {
                $days_all[] = strval($year.$month.'0'.$i); 
            }
            $monthDays = cal_days_in_month(CAL_GREGORIAN, intval($month), $year);//获取当月有多少天
            for ($i = 10; $i <= $monthDays; $i++) {
                $days_all[] = strval($year.$month.$i); 
            }

            $toAdd = array_diff($days_all, $days);/* 需要添加的日期 */
            $returnArr2 = $this->getCalendarByApi($toAdd);
            $returnArr = $returnArr + $returnArr2;
            return $returnArr;
        } else if ($dateLen == '4') {
            $year = $date;
            $returnArr = array();/* 要返回的数组 */

            $datas = $this->dao->select('*')->from('zt_calendar')
                ->where('year')->eq($year)
                ->fetchAll();
            //SELECT * FROM zt_calendar WHERE `year` = ''; 

            $days = array();/* 数据库已经存在的日期 */
            foreach ($datas as $val) {
                $days[] = $val->year.$val->month.$val->day;
                $returnArr[$val->year.$val->month.$val->day] = $val->type;
            }      

            $days_all = array();/* 所有日期 */
            for ($m = 1; $m <= 12; $m++) {
                $m_ = ($m <= 9) ? '0'.$m : strval($m);
                for ($d = 1; $d <= 9; $d++) {
                    $days_all[] = strval($year.$m_.'0'.$d); 
                }
                $monthDays = cal_days_in_month(CAL_GREGORIAN, $m, $year);
                for ($d = 10; $d <= $monthDays; $d++) {
                    $days_all[] = strval($year.$m_.$d); 
                }
            }

            $toAdd = array_diff($days_all, $days);/* 需要添加的日期 */
            $returnArr2 = $this->getCalendarByApi($toAdd);
            $returnArr = $returnArr + $returnArr2;
            return $returnArr;
        }
        return array();
    }

    /* 打印日历 */
    public function PrintMon($year, $mon)
    {
        $enMONTH = array("元月","January" ,"February" ,"March" ,"April" ,"May" ,"June" ,"July" ,"August" ,"September" ,"October" ,"November" ,"December");
        $WEEK = array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
        $html = '';
        date_default_timezone_set("Asia/Shanghai"); 
        $datas = $this->getCalendar($year.$mon);/* 获取节假日 */
        $startdate = strtotime("1 ".$enMONTH[intval($mon)]." $year"); //获取查询的年月
        $enddate = strtotime("+1 month",$startdate);   //获取下一个月的开始日期作为月历输出的截止时间
        $theDate = getdate($startdate); //把日期转化为字符串格式
      
        $html .= '<table border="1" cellspacing="0" cellpadding="0">';
        $html .= '<caption><h1>'.$year . "年". $mon.'月</h1></caption>';
        $html .= '<tr>';
        for ($i = 0; $i < 7; $i++) //输出星期几
        {
            $html .= '<td width="90", height="40" align="center" >';
            $html .= '<h2>'.$WEEK[$i].'</h2>';
            $html .= '</td>';
        }
        $html .= "</tr>";
        $theWeek = $theDate['wday'];//判断当天是星期几
        for ($i = 0; $i < 6; $i++)
        {
            $html .= '<tr>';
            for ($j = 0; $j < 7; $j++)
            {
                $html .= '<td width="90", height="40" align="center" >';
                if ($startdate < $enddate && $theWeek == $j)//把日期输出到对应的星期几所在列,并注意不要超出本月日期
                {
                    /* 判断节假日 */
                    $date = $theDate['year'].($theDate['mon'] >= 10 ? $theDate['mon'] : '0'.$theDate['mon']).($theDate['mday'] >= 10 ? $theDate['mday'] : '0'.$theDate['mday']);
                    $style = ' ';
                    $label = ' ';
                    if ($datas[$date] == 1) {
                        $style = ' style="color:red" ';
                        $label = '<span style="font-size:10px;border:3px solid red;border-radius:50%;position:relative;left:5px;bottom:10px"><span style="font-size:8px">休</span></span>';
                    } else if ($datas[$date] == 2) {
                        $style = ' style="color:red" ';
                        $label = '<span style="font-size:10px;border:3px solid red;border-radius:50%;position:relative;left:5px;bottom:10px"><span style="font-size:8px">假</span></span>';
                    }
                    $html .= '<h2 '.$style.' >'.$theDate['mday'].$label.'</h2>';
                    $startdate = strtotime("+1 day", $startdate); //日期前移1天
                    $theDate = getdate($startdate);//更新日期
                    $theWeek = ($theWeek + 1) % 7;//更新星期
                }
                $html .= '</td>';
            }
            $html .= '</tr>';
            if ($startdate == $enddate) //如果已经输出全部日期,结束循环
            {
                $i = 6;
            }
        }
        $html .= '</table>';
        return $html;
    } 
}

猜你喜欢

转载自blog.csdn.net/qq_17613195/article/details/83863638