以下代码只是简单实现日历的效果和逻辑思路,没有使用类封装,权当抛砖引玉,有兴趣的朋友可以封装起来,方便调用。

<?php

/**
* PHP利用时间函数输出日历
* Rain.zen $ intval@163.com
*/ /**
* 获取关于日历的格式对应的天数
* @param $format 获取的格式[t:指定月份的天数; w:数字型的星期数(0-星期日,6-星期六)]
* @param $year 年份,例:2009
* @param $month 月份,例:03
* @param $day 日期,例:08
* @return bool|string 返回值是根据格式$format的选择决定
*/
function calenderNum($format, $year, $month, $day){
return date($format, mktime(0, 0, 0, $month, $day, $year));
} // 月份数组
$aryMonth = array('一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'); // 当前年月日
$thenTime = date('Y-m-d');
list($thenYear, $thenMonth, $thenDay) = explode('-', $thenTime); // 是否是星期日作为开头[1:是; 0:否]
$isSunday = 0; // 日期:年份下拉控件
$year = isset($_POST['year']) ? $_POST['year'] : $thenYear;
$yearLast = 8; // 年份的前后持续周期
$selectYear = '<select name="year" onchange="this.form.submit();">';
for($i = ($year + $yearLast), $n = ($year - $yearLast); $i >= $n; $i--){
$selected = $i == $year ? ' selected="selected"' : '';
$selectYear.= '<option value="'.$i.'"'.$selected.'>'.$i.'</option>';
}
$selectYear.= '</select>'; // 日期:月份下拉控件
$month = isset($_POST['month']) ? $_POST['month'] : $thenMonth;
$selectMonth = '<select name="month" onchange="this.form.submit();">';
foreach($aryMonth as $k => $v){
$k = sprintf('%02d', ($k + 1));
$selected = $k == $month ? ' selected="selected"' : '';
$selectMonth.= '<option value="'.$k.'"'.$selected.'>'.$v.'月</option>';
}
$selectMonth.= '</select>';
unset($k, $v); // 日期:星期HTML
$aryWeek = array('一', '二', '三', '四', '五', '六');
$isSunday AND array_unshift($aryWeek, '日');
$isSunday OR array_push($aryWeek, '日');
$weekTrHtml = '<tr>';
foreach($aryWeek as $v){
$weekTrHtml.= '<td>周'.$v.'</td>';
}
$weekTrHtml.= '</tr>';
unset($v); // 以下为计算当月的天数以及前后月份作为空位补齐日历表格
$allDay = calenderNum('t', $year, $month, $thenDay); // 指定月份的天数
$monthFirstDay2weekVal = calenderNum('w', $year, $month, 1); // 指定日期的星期数
$aryDay = range(1, $allDay); // 计算第一排表格空位数以及是否需要补齐
$each = $isSunday ? 7 : 6;
$firstNum = $isSunday ? $monthFirstDay2weekVal : ($monthFirstDay2weekVal-1);
$isAddDay = $firstNum % $each; // 用上月的最后几天补齐空位数
if($isAddDay != 0 ){
$prevMonth = intval($month) - 1;
$prevMonthDay = calenderNum('t', $year, $prevMonth, 1); // 计算上月的总天数
$aryFirst = range($prevMonthDay - $firstNum + 1, $prevMonthDay);
$aryDay = array_merge($aryFirst, $aryDay);
} // 计算最后一排表格空位数以及是否需要补齐
$lastNum = count($aryDay) % 7;
$lastNum == 0 OR $aryLast = range(1, (7 - $lastNum));
isset($aryLast) AND $aryDay = array_merge($aryDay, $aryLast); // 循环输出日期的表格
$x = count($aryDay) / 7;
$y = 1;
$dayTrHtml = '<tr>';
foreach($aryDay as $i => $rsDay){ $strDay = str_pad($rsDay,2,'0',STR_PAD_LEFT);
$dayOass = ($i < $firstNum || $i >= $firstNum + $allDay) ? ' class="z-pass"' : '' ; // 把非本月的日期变为灰色
$dayOn = ($thenYear == $year && $thenMonth == $month && $strDay == $thenDay && empty($dayOass)) ? ' class="z-on"' : ''; // 对当前的日期加亮显示 $dayTrHtml.= '<td'.$dayOn.$dayOass.'>'.$strDay.'</td>';
if(($i + 1) % 7 == 0){
$x == $y OR $dayTrHtml.= '</tr>'.'<tr>';
$y++;
}
}
$dayTrHtml.= '</tr>';
?>

模板HTML代码

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>PHP程序输出日历</title>
<style type="text/css">
/* global css document => author:intval@163.com */
html{height:100%;-overflow-y:scroll;border:0}body{min-height:100%;-height:100%;position:relative}
body,h1,h2,h3,h4,h5,h6,p,div,dl,dt,dd,ul,ol,li,form,button,input,textarea,th,td{margin:0;padding:0;border:0}
h1,h2,h3,h4,h5,h6,select,input,textarea,button,table{font-size:100%;font-weight:normal}
ul,ol,dl{list-style:none}a{text-decoration:none;color:#36c}u{text-decoration:none}i,em{font-style:normal}
a:hover{text-decoration:underline}a img{border:none}a,select,input,textarea{outline:none}.fr{float:right}
table{border-collapse:collapse;border-spacing:0}th{text-align:left;font-weight:normal}.fl{float:left}
.cf:before,.cf:after{content:"";display:table}.cf:after{clear:both}.cf{+zoom:1}
body{color:#000;background:#fff;font:12px/15px Microsoft YaHei} #u-calender{padding:50px 0 0 200px}
#u-calender #u-slt{font-size:14px}
#u-slt select{font:13px Verdana}
#u-calender .z-on{background:#36c;color:#fff; font-weight:700}
#u-calender .z-pass{background:#efefef;color:#ccc}
#u-calender table{ border-top:1px solid #ccc; border-right:1px solid #ccc; width:300px}
#u-calender table tr td{ border-bottom:1px solid #ccc; border-left:1px solid #ccc;text-align:center;padding:5px 0}
</style>
</head> <body>
<div id="u-calender">
<table><tr><td colspan="7" id="u-slt"><form action="" method="post">月份:<?php echo $selectMonth;?>&nbsp;&nbsp;&nbsp;&nbsp;年份:<?php echo $selectYear;?></form></td></tr>
<?php echo $weekTrHtml.$dayTrHtml;?>
</table>
</div>
</body>
</html>

代码完成后实现的效果截图:

PHP程序输出日历的更多相关文章

  1. JS输出日历

    页面HTML代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> &l ...

  2. C#输出日历

    用C#输出日历,此功能可用于Ajax方式列出计划日程相关的内容,由于是C#控制输出,可以方便加上自己需要的业务处理逻辑. 1.控制台输出: using System; namespace 控制台日历 ...

  3. Bootstrap3 代码-程序输出

    通过 <samp> 标签来标记程序输出的内容. This text is meant to be treated as sample output from a computer prog ...

  4. C语言 · 输出日历

    算法提高 输出日历   时间限制:1.0s   内存限制:512.0MB      按照下述格式打印2006年12月日历: Calendar 2006-12---------------------- ...

  5. java笔记--重定向输出流实现程序输出到日志

    重定向输出流实现程序输出到日志 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877248.html "谢谢-- 利用Sy ...

  6. 双缓冲解决控制台应用程序输出“闪屏”(C/C++,Windows)

    使用 C 语言编写游戏的小伙伴们想必起初都要遇到这样的问题,在不断清屏输出数据的过程中,控制台中的输出内容会不断地闪屏.出现这个问题的原因是程序对数据处理花掉的时间影响到了数据显示,或许你可以使用局部 ...

  7. 用VSCode终端实现重定向比较程序输出和正确输出

    在刷 OJ 题目或者进行编程考试或比赛时,经常需要对编写好的程序进行测试,即运行编写好的程序,输入样例输入或者自己编写的输入数据,查看程序输出结果和样例输出或者正确输出是否一致.这种方法有很多弊端,当 ...

  8. cmake指定程序输出目录和库文件输出目录和拷贝文件

    概述 本文样式环境: win10+cmake 3.18 本文将介绍使用CMAKE配置项目输出目录和 LIbrary项目的输出目录 本文将介绍 cmake的file函数的基础用法之拷贝文件 重点, 这些 ...

  9. linux下QT程序输出乱码解决方法

    参考文章:http://blog.csdn.net/jiang1013nan/article/details/6667871 http://my.oschina.net/zjlaobusi/blog/ ...

随机推荐

  1. MYSQL报Fatal error encountered during command execution.错误的解决方法

    {MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command executio ...

  2. C#核编之系统数据类型和相应的C#关键字

    和任何编程语言一样,C#定义了一组用于表示局部变量.成员变量.返回值以及输入参数的基本数据类型.然而,与其他编程语言不同的是,这些关键字不只是编译器能识别的标记.C#关键字其实是System命名空间中 ...

  3. SQL Server 死锁检查

    示例代码 select spid, blocked, status, hostname, program_name, hostprocess, cmd from sysprocesses -- kil ...

  4. Python学习笔记(一)基础

    学习资料 跟着廖雪峰的Python教程学习Python,大家可以去官方网站查看学习教程.使用的Python版本为3.0.x,解释器为CPython.本系列博客为学习笔记,记录跟随廖老师所学知识,同时会 ...

  5. webform登录操作中正则表达式运用

    关于正则表达式的运用,估计很多人都会觉得这很麻烦.确实很麻烦,太多表达式我也记不住,很多都是临时需要用的时候再去查,有点小学生读小说的架势,不认识的字再去翻字典. 正则表达式严格来说对于程序的功能实现 ...

  6. Linux--本地yum库

    Linux配置本地yum云: 第一步:把cd 挂载到目录树 mount /dev/cdrom /mnt/media 第二步:增加/etc/yum.repo.d/local.repo touch /et ...

  7. matlab绘制函数

    >> x1=linspace(,*pi,); x2=linspace(,*pi,); x3=linspace(,*pi,); y1=sin(x1); y2=+sin(x2); y3=+si ...

  8. 提交(post)xml文件给指定url的2种方法

    原文:提交(post)xml文件给指定url的2种方法 1  这段代码是在网上搜到的,拿来共享,项目正好要用到.其中的data你只需要传递一个xml字符串就可以 protected   string  ...

  9. Build A Micro Team

    最近这两周一直在忙,忙到忘记回QQ和微信的程度,甚至有两天下班回来直接躺平,虽说忙碌但是也收获了不少. Start 说起来有趣,最近在忙的这个项目最初是公司设立的用于工程师在业余时间开发的projec ...

  10. Developer‘s提升开发效率的工具和插件或编程语言

    1.Git 之前也有过不少版本控制的工具.有好的,也有糟糕的.不过它们都或多或少地误入歧途了. 这时候Git出现了.一旦你用上了这个神奇的工具,很难相像你还会碰到比它更好的了. 还没用过Git?试一下 ...