// 以下接口每年更新一次,具体什么时候更新我也不知道,需等国务院发布
$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;
}
}