0

0

浅谈PHP第八弹---使用PHP的date函数输出日历_PHP教程

php中文网

php中文网

发布时间:2016-07-13 17:50:53

|

1296人浏览过

|

来源于php中文网

原创

Hello,大家好,前两天给大家讲解了下RBAC【基于角色的访问控制】的基本思想,不知道大家是否已经明白其原理,使用起来是否得心应手,在开发项目的过程中可以尝试运用下,这样会理解的更加透彻,上文中给大家写的那个RBAC类,并不一定真正适合我们的项目开发,给大家写此类的目的只为帮助大家更透彻的理解RBAC的工作原理以及使用方法...
好了,大家可能已经觉得我啰嗦了,废话不多说了,今天来给大家讲解:
在已知开始日期,已知结束日期的基础上,使用PHP的date函数遍历输出日历:
日常生活中,日历与我们的生活工作息息相关,必不可少,所以今天给大家讲了日历以后,大家可以尝试着做一个电子日历,每天提醒自己当天要完成的任务,还是很有趣的。
好,首先我们先来了解一下date函数,同学们都知道,date函数可以获取当前的年月日,但date函数的功能不仅限于此,我们通过PHP官方手册来查询下它的参数看看:


format 字符 说明 返回值例子
日 --- ---
d 月份中的第几天,有前导零的 2 位数字 01 到 31
D 星期中的第几天,文本表示,3 个字母 Mon 到 Sun
j 月份中的第几天,没有前导零 1 到 31
l(“L”的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday
N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
S 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j一起用
w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
z 年份中的第几天 0 到 366
星期 --- ---
W ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) 例如:42(当年的第 42 周)
月 --- ---
F 月份,完整的文本格式,例如 January 或者 March January 到 December
m 数字表示的月份,有前导零 01 到 12
M 三个字母缩写表示的月份 Jan 到 Dec
n 数字表示的月份,没有前导零 1 到 12
t 给定月份所应有的天数 28 到 31
年 --- ---
L 是否为闰年 如果是闰年为 1,否则为 0
o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
Y 4 位数字完整表示的年份 例如:1999 或 2003
y 2 位数字表示的年份 例如:99 或 03
时间 --- ---
a 小写的上午和下午值 am 或 pm
A 大写的上午和下午值 AM 或 PM
B Swatch Internet 标准时 000 到 999
g 小时,12 小时格式,没有前导零 1 到 12
G 小时,24 小时格式,没有前导零 0 到 23
h 小时,12 小时格式,有前导零 01 到 12
H 小时,24 小时格式,有前导零 00 到 23
i 有前导零的分钟数 00 到 59>
s 秒数,有前导零 00 到 59>
时区 --- ---
e 时区标识(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores
I 是否为夏令时 如果是夏令时为 1,否则为 0
O 与格林威治时间相差的小时数 例如:+0200
P 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) 例如:+02:00
T 本机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如“EasternStandard Time”,中文版会显示“中国标准时间”)。
Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -43200 到 43200
完整的日期/时间 --- ---
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
U 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 

大家可以看到,php的date函数无所不能,那我们就用date函数来写一个日历出来:
/*+---------------------------------------------------------------------------------------+
| 日历类
+-----------------------------------------------------------------------------------------+
| 版权所有 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.= "

";
$str.= "";
$str.= "";
$str.= "";
//返回表头
return $str;
}
/**
* 输出每月的星期表头方法
* @return 返回星期表头
*/
private function get_week(){
//定义一个空字符串
$str='';
$str.= "";
for($w=0;$w //遍历输出星期一至星期日
$str.= "";
}
$str.= "";
}
$str.= "";
//返回星期头
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.= "";
}
//如果从开始时间月初后的第i天为该月的第一天,遍历输出空格
if(date("d",$this->start+($i*(24*60*60)))==1){
//星期n就输出n-1个空格
for($m=1;$mstart+($i*(24*60*60)));$m++){
$str.= "
";
}
}
//返回输出的空格
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 $str.= "";
}
}
//返回补全的空格
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.= "";
//返回输出的日期
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.= "";
//如果从开始时间月初后的第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 while($t //开始输出换行
$str.= "";
for($n=1;$n //输出七个空格
$str.= "";
}
$str.= "";
//行数自加一
$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.= "
";
//获取开始时间月初第i天后的年和月
$str.= date("Y",$this->start+($i*(24*60*60)))."年".date("m",$this->start+($i*(24*60*60)))."月";
$str.= "
".$this->week[$w];
if($w==5 || $w==6){
//如果为周六或周日,添加放假的小图标
$str.= "@@##@@
";
//如果从开始时间月初后的第i天为结束日期,输出背景为#EE6363色的表格
}elseif(date("Ymd",$this->start+($i*(24*60*60)))==$this->end_year.$this->end_month.$this->end_day){
$str.= "
";
//如果从开始时间月初后的第i天为当前日期,输出背景为#EE2C2C色的表格
}elseif(date("ymd",$this->start+($i*(24*60*60)))==(date("ymd",time()))){
$str.= "
";
//否则输出无背景色的表格
}else{
$str.= "
";
}
//输出从开始时间月初后的第i天的日期
$str.= date("j",$this->start+($i*(24*60*60)));
$str.= "
";
//并将行数计数器改为1
$t=1;
}
//返回结束表格
return $str;
}
/**
* 获取输出月份表格的样式和事件
* @return 返回月份表格的样式和事件
*/
private function get_style(){
$str = "";
$str .= "<script type="text/javascript">";<br> //以只读方式打开js文件<br> $handle = fopen($this->script,'r');<br> //读出来文件内容赋给一个变量<br> $str .= fread($handle,filesize($this->script));<br> fclose($handle);<br> $str .= "</script>";
//返回文件内容
return $str;
}
/**
* 获取日期表格
* @param i 从开始时间月初后的第i天,默认为0
* @return 返回日期表格
*/
public function get_datetab($i=0){
//获取样式和事件
$str = $this->get_style();
//按开始日期到结束日期的天数开始遍历日期
for($i=0,$t=1;$iday_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.rarhttp://bbs.lampbrother.net/job.php?action=download&aid=21095

 

立即学习PHP免费学习笔记(深入)”;

ExcelFormulaBot
ExcelFormulaBot

在AI帮助下将文本指令转换为Excel函数公式

下载

 

立即学习PHP免费学习笔记(深入)”;

作者 zdrjlamp

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/478235.htmlTechArticleHello,大家好,前两天给大家讲解了下RBAC【基于角色的访问控制】的基本思想,不知道大家是否已经明白其原理,使用起来是否得心应手,...
浅谈PHP第八弹---使用PHP的date函数输出日历_PHP教程

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

928

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

307

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

183

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

29

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

103

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

54

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

764

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

92

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.5万人学习

Bootstrap4.x---十天精品课堂
Bootstrap4.x---十天精品课堂

共22课时 | 1.8万人学习

ECMAScript6 / ES6---十天技能课堂
ECMAScript6 / ES6---十天技能课堂

共25课时 | 2.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号