制作年历
2.1实训说明
2.1.1 实验背景
日历是一种记载日期等相关信息的出版物,通常每页显示一日信息的叫日历,每页显示一个月信息的叫月历,每页显示全年信息的叫年历。
从日历的诞生至今,它有多种的呈现形式,如挂历、台历、年历卡、电子日历、万年历等。
2.1.2 功能描述
在生活中,日历对于人们的旅程规划、行程安排和工作计划等有着重要的作用。
下面将使用现阶段学习过的知识来实现年历的制作。
具体需求如下所示:
●根据用户输入的年份输出对应的年历
●用户可输入年份的取值范围是1582~9999
●判断31天的月份(1月、3月、5月、7月、8月、10月、12月)
●判断30天的月份(4月、6月、9月、11月)
●实现闰年2月29天,平年2月28天的功能
●将日期按照对应的星期输出展示
●按照3行4列的方式展示给定年份的年历
●确定年历中每月的星期输出顺序为“日、一、二、三、四、五、六”
接下来对本阶段案例的实现思路进行系统的分析,将一个复杂的案例分解成多个阶段,逐一进行实现,具体如下图所示。
年历实现思路图
从上图可以清晰的看到,实现年历的制作流程共分为6个阶段,第1阶段和第2阶段的判断是为了确定第3阶段2月份的天数,闰年2月份29天,平年28天。
接着在第4阶段将每月的1日设置为周天,使用0表示,周一到周六分别使用1~6表示,循环输出年历。
然后利用蔡勒公式计算用户给定年份的1月1日对应的星期。
最后对每月1号不是周日的月份日期,在输出前进行空白填充。
2.1.3 必备技术
(一)网页技术(HTML+CSS)
1.HTML网页构建的基本设计;
2.HTML网页样式的基本设计;
(二)PHP开发语言
1.变量
2.运算符
3.if语句
4.for语句
2.1.4 学时分配
实训课程学时安排可参考下表。
2.1.5 实训目标
1.熟练掌握if、for、逻辑运算符的使用。
2.掌握编程实现网页年历的生成。
2.2准备开发环境
本项目支持如下软件版本的运行环境:
●Apache 2.2~2.4
●PHP 5.3~7.1
●支持WampServer、XAMPP等集成环境
2.3实训任务描述
任务一:判断世纪年和普通年
【任务描述】
通常来讲,一百年是一个世纪,因此,只要用户给定的年份除以100,余数为0则表示该年份为世纪年,否则为普通年。
编写PHP文件calendar.php,具体代码如下所示。
在上述代码中,变量$year用于保存用户给出的4位数字表示的年份,如2008表示2008年,1998表示1998年。
当$year是世纪年时,表达式“$year % 100”的结果为0,与0相等结果为真,则if语句判断为真,输出第5行提示语句,否则输出第7行的提示语句。
值得一提的是,第4行的判断语句中,表达式“$year % 100”的结果有两种情况,分别是0和任意正整数,而任意正整数在条件判断语句中会自动转换成布尔类型值true,0转换成false。
因此,可以将第4~8行代码修改成如下形式。
在程序开发中,若在不考虑程序运行的复杂程度,两种方式都可以。
但若是要减少程序运行的复杂度,则建议使用第2种编写方式。
任务二:判断闰年和平年
【任务描述】
闰年是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。
补上时间差的年份为闰年。
其中,对于世纪年和普通年的闰年算法有所不同,具体如下:
●普通年闰年的判断条件,需要同时满足除以4余数为0且除以100余数不为0的
两种情况
●世纪年闰年的判断条件,需要同时满足除以400余数为0且除以3200余数不为0
的两种情况
接下来,去掉上面输出的提示信息,添加确定是闰年还是平年的判断,继续编写PHP
文件calendar.php,具体代码如下。
上述第3~5行代码用于判断普通年是否为闰年,第7~9行代码用于判断世纪年是否为闰年。
当为闰年时将变量$leap的值设置1,方便后面的判断。
此外,if判断后若只有一条执行语句,则可以去掉“{}”,因此可以将上述第3~5行和第7~9行代码修改成以下形式。
任务三:判断每月最大的日期
【任务描述】
继续编写calendar.php文件,实现每月最大日期的判断。
具体代码如下所示。
上述第3行代码用于判断1月、3月、5月、7月、8月、10月或12月时每月最大的日期为31,第5~6行用于判断2月在闰年时最大的日期为29,普通年时为28,其余的月份最大的日期则是30。
接着可以通过for循环进行测试查看,在上述第9行代码后添加以下代码,具体如下。
在浏览器中运行calendar.php文件,效果如下图所示。
从图中可以清晰的看出每个月共有多少天,以及各个月份天数的差别。
任务四:输出年月日对应的日期
【任务描述】
1.分行输出年历
获取到每月共多少天后,接下来将每个月的日期按照星期的设置格式在表格中输出展示。
其中,关于如何实现7个日期一行的设计思路如下所示。
(1)根据需求分析,得到星期输出顺序为“日、一、二、三、四、五、六”。
(2)设定星期使用0~6之间的7位数字进行表示,0表示星期日,1表示星期一,依次类推。
(3)将用户给定年份的每月1日对应的星期变量$w这里先假设为0
(4)在循环每月的日期时,动态为星期变量$w加1,并判断$w的值是否大于6,若大于6,重置为0。
(5)当星期变量$w等于6且不是最后一天时,设置换行
按照上面的设计思路,修改calendar.php文件,并去掉测试查看代码。
在确定每月的最大日期后添加日期变量$w,用于保存假设的某年某月1日对应的星期。
具体代码如下。
上述第7~8行用于输出日历的标题和星期,第10行用于循环每月的日期,第11行用于在表格中输出日期,第12行用于在表格中实现换行,即结束当前行,并开始下一行。
第15行用于设置星期的变动。
修改完成后,在浏览器中进行预览,效果如下图所示。
分行展示年历
从上述的预览效果中可以看出,每月的日期按照星期的格式展示,但是每个日期对应的星期并不符合日期的算法。
因此,接下来我们利用蔡勒公式计算出年月日对应的星期。
2.按星期输出年历
在完成对应星期的计算前,首先具体看一下蔡勒公式以及其涉及到的具体变量含义,具体如下。
w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 – y / 100 + y / 400) % 7 在上述给出的蔡勒公式中,共出现了4个变量,分别为w、y、m和d。
这些变量的具体含义如下所示。
●w:表示星期,其值取值范围是0~6,0表示星期日,1表示星期一,依次类推。
●y:4位数字表示的年份,其有效可以计算的范围是从1582年10月起。
如2020表
示2020年。
●m:表示月份,其取值范围是3~14,3表示3月,4表示4月,依次类推。
值得注
意的是,在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算。
如2020
年1月10日将要看作2019年的13月1日来计算。
●d:表示日,其取值范围是1~31
了解蔡勒公式的规定后,删除calendar.php文件中设置的星期变量$w,在判断每月的日期前添加以下代码,具体如下:
在上述代码中,在利用蔡勒公式计算年月日对应的星期时,对于执行除法(/)的运算要利用强制类型转换取整,防止出现小数的情况。
其中,当某月的1号不是星期日时,我们需要在1号输出前填充空白占位。
继续编写calendar.php文件,添加填充空白的代码。
具体实现如下。
上述第4行代码用于判断当前日期为1号,且对应的星期不是星期日时,执行第5行代码填充空白。
这里是通过合并单元格的方式实现,当然还可以采用其他方式,如添加空白占位符。
为了让年历的展示更加的精美,可按照个人喜好设置CSS样式,参考效果如图所示。