设为首页 收藏本站
查看: 669|回复: 0

[经验分享] 【捷哥浅谈PHP】第八弹 --- 使用PHP的date函数输出日历

[复制链接]

尚未签到

发表于 2017-4-4 12:38:15 | 显示全部楼层 |阅读模式
Hello,大家好,前两天给大家讲解了下RBAC【基于角色的访问控制】的基本思想,不知道大家是否已经明白其原理,使用起来是否得心应手,在开发项目的过程中可以尝试运用下,这样会理解的更加透彻,上文中给大家写的那个RBAC类,并不一定真正适合我们的项目开发,给大家写此类的目的只为帮助大家更透彻的理解RBAC的工作原理以及使用方法...
好了,大家可能已经觉得我啰嗦了,废话不多说了,今天来给大家讲解:

在已知开始日期,已知结束日期的基础上,使用PHP的date函数遍历输出日历:
日常生活中,日历与我们的生活工作息息相关,必不可少,所以今天给大家讲了日历以后,大家可以尝试着做一个电子日历,每天提醒自己当天要完成的任务,还是很有趣的。
好,首先我们先来了解一下date函数,同学们都知道,date函数可以获取当前的年月日,但date函数的功能不仅限于此,我们通过PHP官方手册来查询下它的参数看看:


format
字符
说明返回值例子
------
d月份中的第几天,有前导零的 2 位数字0131
D星期中的第几天,文本表示,3 个字母MonSun
j月份中的第几天,没有前导零131
l(“L”的小写字母)星期几,完整的文本格式SundaySaturday
NISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加)1(表示星期一)到 7(表示星期天)
S每月天数后面的英文后缀,2 个字符stndrd 或者 th。可以和 j一起用
w星期中的第几天,数字表示0(表示星期天)到 6(表示星期六)
z年份中的第几天0366
星期------
WISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的)例如:42(当年的第 42 周)
------
F月份,完整的文本格式,例如 January 或者 MarchJanuaryDecember
m数字表示的月份,有前导零0112
M三个字母缩写表示的月份JanDec
n数字表示的月份,没有前导零112
t给定月份所应有的天数2831
------
L是否为闰年如果是闰年为 1,否则为 0
oISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加)Examples: 1999 or 2003
Y4 位数字完整表示的年份例如:19992003
y2 位数字表示的年份例如:9903
时间------
a小写的上午和下午值ampm
A大写的上午和下午值AMPM
BSwatch Internet 标准时000999
g小时,12 小时格式,没有前导零112
G小时,24 小时格式,没有前导零023
h小时,12 小时格式,有前导零0112
H小时,24 小时格式,有前导零0023
i有前导零的分钟数0059>
s秒数,有前导零0059>
时区------
e时区标识(PHP 5.1.0 新加)例如:UTCGMTAtlantic/Azores
I是否为夏令时如果是夏令时为 1,否则为 0
O与格林威治时间相差的小时数例如:+0200
P与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加)例如:+02:00
T本机所在的时区例如:ESTMDT(【译者注】在 Windows 下为完整文本格式,例如“EasternStandardTime”,中文版会显示“中国标准时间”)。
Z时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。-4320043200
完整的日期/时间------
cISO 8601 格式的日期(PHP 5 新加)2004-02-12T15:19:21+00:00
rRFC 822 格式的日期例如:Thu, 21 Dec 2000 16:01:07 +0200
U从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数


大家可以看到,php的date函数无所不能,那我们就用date函数来写一个日历出来:

  • <?php

  • /*+---------------------------------------------------------------------------------------+
  • | 日历类
  • +-----------------------------------------------------------------------------------------+
  • | 版权所有 lamp兄弟连
  • +-----------------------------------------------------------------------------------------+
  • | 作者: 李捷 (lijie@li-jie.me)
  • | 最后修改时间: 2012-05-9 12:30
  • +-----------------------------------------------------------------------------------------+
  • */
  • class LampDate{
  • private $start_year; //开始年份
  • private $start_month; //开始月份
  • private $start_day; //开始日期
  • private $end_year; //结束年份
  • private $end_month; //结束月份
  • private $end_day; //结束日期
  • private $start_time; //开始时间的时间戳
  • private $end_time; //结束时间的时间戳
  • //定义周表头数组
  • private $week = array("星期一","星期二","星期三","星期四","星期五","星期六","星期日");
  • //开始时间月初的时间戳
  • private $start;
  • //开始时间月末的时间戳
  • private $end;
  • //样式表CSS文件路径
  • private $css;
  • //JS事件文件的路径
  • private $script;

  • /**
  • * 日历类构造方法
  • * @param start_year 开始年份
  • * @param start_month 开始月份
  • * @param start_day 开始日期
  • * @param end_year 结束年份
  • * @param end_month 结束月份
  • * @param end_day 结束日期
  • * @param css 输出日期的样式
  • * @param script 输出日期的事件
  • */
  • public function __construct($start_year='2012',$start_month='1',$start_day='1',$end_year='2012',$end_month='12',$end_day='31',$css='style.css',$script='js.js'){
  • $this->start_year = $start_year; //给开始年份赋值
  • $this->start_month = $start_month; //给开始月份赋值
  • $this->start_day = $start_day; //给开始日期赋值
  • $this->end_year = $end_year; //给结束年份赋值
  • $this->end_month = $end_month; //给结束月份赋值
  • $this->end_day = $end_day; //给结束日期赋值
  • $this->css = $css; //指定日期的CSS
  • $this->script = $script; //指定日期的JS事件
  • //获取开始日期的时间戳
  • $this->start_time = strtotime($this->start_year."-".$this->start_month."-".$this->start_day);
  • //获取结束日期的时间戳
  • $this->end_time = strtotime($this->end_year."-".$this->end_month."-".$this->end_day);
  • //获取开始时间月初的时间戳
  • $this->start = strtotime($this->start_year."-".$this->start_month."-01");
  • //获取开始时间月末的时间戳
  • $this->end = strtotime($this->end_year."-".$this->end_month."-".date("t",$this->end_time));
  • //获取开始日期到结束日期的天数
  • $this->day_count = (($this->end)-($this->start))/(24*60*60);
  • }

  • /**
  • * 获取每月表格的表头
  • * @param i 从开始时间月初后的第几天
  • * @return 返回表头 --年--月
  • */
  • private function get_caption($i){
  • //定义一个空字符串
  • $str ='';
  • $str.= "<table border='0' cellspacing='0' cellpadding='0'>";
  • $str.= "<tr>";
  • $str.= "<td colspan='7' align='center' height='30px' bgcolor='#5CACEE' style='color:white;font-weight:bold'>";
  • //获取开始时间月初第i天后的年和月
  • $str.= date("Y",$this->start+($i*(24*60*60)))."年".date("m",$this->start+($i*(24*60*60)))."月";
  • $str.= "</td>";
  • $str.= "</tr>";
  • //返回表头
  • return $str;
  • }

  • /**
  • * 输出每月的星期表头方法
  • * @return 返回星期表头
  • */
  • private function get_week(){
  • //定义一个空字符串
  • $str='';
  • $str.= "<tr bgcolor='#B0E0E6'>";
  • for($w=0;$w<7;$w++){
  • //遍历输出星期一至星期日
  • $str.= "<td height='30px' width='80px' align='center' style='position:relative'>".$this->week[$w];
  • if($w==5 || $w==6){
  • //如果为周六或周日,添加放假的小图标
  • $str.= "<img src='jia.jpg' style='position:absolute;top:0;right:0;'></td>";
  • }
  • $str.= "</td>";
  • }
  • $str.= "</tr>";
  • //返回星期头
  • return $str;
  • }

  • /**
  • * 补全月份前端的空格
  • * @param i 从开始时间月初后的第i天
  • * @return 返回补全的空格
  • */
  • private function get_space_front($i){
  • //定义一个空字符串
  • $str='';
  • //如果从开始时间月初后的第i天为星期一,输出一个tr换行
  • if(date("N",$this->start+($i*(24*60*60)))==1){
  • $str.= "<tr>";
  • }
  • //如果从开始时间月初后的第i天为该月的第一天,遍历输出空格
  • if(date("d",$this->start+($i*(24*60*60)))==1){
  • //星期n就输出n-1个空格
  • for($m=1;$m<date("N",$this->start+($i*(24*60*60)));$m++){
  • $str.= "<td bgcolor='#EDEDED'> </td>";
  • }
  • }
  • //返回输出的空格
  • return $str;
  • }

  • /**
  • * 补全月份后端的空格
  • * @param i 从开始时间月初后的第i天
  • * @return 返回补全的空格
  • */
  • private function get_space_back($i){
  • //定义一个空字符串
  • $str='';
  • //如果从开始时间月初后的第i天的天数为该月的月末
  • if(date("ymd",$this->start+($i*(24*60*60)))==date("ymt",$this->start+($i*(24*60*60)))){
  • //星期n就输出7-n个空格
  • for($w=date("N",$this->start+($i*(24*60*60)));$w<7;$w++){
  • $str.= "<td bgcolor='#EDEDED'> </td>";
  • }
  • }
  • //返回补全的空格
  • return $str;
  • }

  • /**
  • * 输出当前日期
  • * @return 返回日期
  • */
  • private function get_date($i){
  • //定义一个空字符串
  • $str='';
  • //如果从开始时间月初后的第i天为开始日期,输出背景为#7CCD7C色的表格
  • if(date("Ymd",$this->start+($i*(24*60*60)))==$this->start_year.$this->start_month.$this->start_day){
  • $str.= "<td align='center' height='30px' bgcolor='#7CCD7C' style='color:white'>";
  • //如果从开始时间月初后的第i天为结束日期,输出背景为#EE6363色的表格
  • }elseif(date("Ymd",$this->start+($i*(24*60*60)))==$this->end_year.$this->end_month.$this->end_day){
  • $str.= "<td align='center' height='30px' bgcolor='#EE6363' style='color:white'>";
  • //如果从开始时间月初后的第i天为当前日期,输出背景为#EE2C2C色的表格
  • }elseif(date("ymd",$this->start+($i*(24*60*60)))==(date("ymd",time()))){
  • $str.= "<td align='center' height='30px' bgcolor='#EE2C2C' style='color:white'>";
  • //否则输出无背景色的表格
  • }else{
  • $str.= "<td align='center' height='30px' class='date'>";
  • }
  • //输出从开始时间月初后的第i天的日期
  • $str.= date("j",$this->start+($i*(24*60*60)));
  • $str.= "</td>";
  • //返回输出的日期
  • return $str;
  • }

  • /**
  • * 输出补全的空行
  • * @param i 从开始时间月初后的第i天
  • * @param t 每月输出的行数
  • * @return 返回补全的空行
  • */
  • private function get_rows($i,&$t){
  • //定义一个空字符串
  • $str='';
  • //如果从开始时间月初后的第i天为星期天
  • if(date("N",$this->start+($i*(24*60*60)))==7){
  • //换行
  • $str.= "</tr>";
  • //如果从开始时间月初后的第i天为本月的最后一天并且为周日
  • if(date("ymd",$this->start+($i*(24*60*60)))==date("ymt",$this->start+($i*(24*60*60))) && date("N",$this->start+($i*(24*60*60)))==7){
  • //行数自减
  • $t--;
  • }
  • //行数自加
  • $t++;
  • }
  • //如果从开始时间月初后的第i天为本月的最后一天并且此时的行数小于6
  • if(date("ymd",$this->start+($i*(24*60*60)))==date("ymt",$this->start+($i*(24*60*60))) && $t<6){
  • while($t<6){
  • //开始输出换行
  • $str.= "<tr>";
  • for($n=1;$n<=7;$n++){
  • //输出七个空格
  • $str.= "<td height='30px' bgcolor='#EDEDED'> </td>";
  • }
  • $str.= "</tr>";
  • //行数自加一
  • $t++;
  • }
  • }
  • //输出补全的空行
  • return $str;
  • }

  • /**
  • * 结束表格的输出
  • * @param i 从开始时间月初后的第i天
  • * @param t 日期表格的行数
  • * @return 结束表格
  • */
  • private function get_endtab($i,&$t){
  • //定义一个空字符串
  • $str='';
  • //如果从开始日期后的第i天为本月最后一天
  • if(date("d",$this->start+($i*(24*60*60)))==date("t",$this->start+($i*(24*60*60)))){
  • //输出结束表格
  • $str.= "</table>";
  • //并将行数计数器改为1
  • $t=1;
  • }
  • //返回结束表格
  • return $str;
  • }

  • /**
  • * 获取输出月份表格的样式和事件
  • * @return 返回月份表格的样式和事件
  • */
  • private function get_style(){
  • $str = "<style type='text/css'>";
  • //以只读方式打开css文件
  • $handle = fopen($this->css,'r');
  • //读出来文件内容赋给一个变量
  • $str .= fread($handle,filesize($this->css));
  • fclose($handle);
  • $str .= "</style>";
  • $str .= "<script type='text/javascript'>";
  • //以只读方式打开js文件
  • $handle = fopen($this->script,'r');
  • //读出来文件内容赋给一个变量
  • $str .= fread($handle,filesize($this->script));
  • fclose($handle);
  • $str .= "</script>";
  • //返回文件内容
  • return $str;
  • }

  • /**
  • * 获取日期表格
  • * @param i 从开始时间月初后的第i天,默认为0
  • * @return 返回日期表格
  • */
  • public function get_datetab($i=0){
  • //获取样式和事件
  • $str = $this->get_style();
  • //按开始日期到结束日期的天数开始遍历日期
  • for($i=0,$t=1;$i<=$this->day_count;$i++){
  • //如果为本月的第一天
  • if(date("d",$this->start+($i*(24*60*60)))==1){
  • //获取表头
  • $str.=$this->get_caption($i);
  • //获取星期表头
  • $str.=$this->get_week($i);
  • }
  • //补全表格前面的空格
  • $str.=$this->get_space_front($i);
  • //获取日期
  • $str.=$this->get_date($i);
  • //补全表格后面的空格
  • $str.=$this->get_space_back($i);
  • //定义日期表格的行数
  • $str.=$this->get_rows($i,$t);
  • //结束表格
  • $str.=$this->get_endtab($i,$t);
  • }
  • //返回日期表格
  • return $str;
  • }
  • }

  

我里面加了较全的注释,大家有什么不明白的地方可以跟帖回复提问,抑或我会在下一帖中再给大家详细讲解下大家共同遇到的问题,敬请期待....

输出效果:

我把代码发上来,大家可以下载研究下:

日历代码 date_class.rar

更多给力文章,请挪步:
【捷哥浅谈PHP】第一弹---php位运算符”|”和逻辑运算符”||”遇到的问题
【捷哥浅谈PHP】第二弹---经典算法的运用(冒泡排序和快速排序)
【捷哥浅谈PHP】第三弹---使用二分查找法查找数组中的元素位置
【捷哥浅谈PHP】第四弹---递归函数
【捷哥浅谈PHP】第五弹 --- 分页之九阳神功
【捷哥浅谈PHP】第六弹 ---- 使用for循环输出九九乘法表

【捷哥浅谈PHP】第七弹 ---- 基于角色的访问控制RBAC
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-360083-1-1.html 上篇帖子: php CI数据库操作整理 下篇帖子: 【转】Eclipse集成PDT+XDebug调试PHP脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表