使用php简单的做了一个日历,对php的时间函数又有了一个全新的提升认识!
实现日历其实也比较简单,主要有几步:
1. 首先调整好一个要显示的基本样式
2. 获取每个月第一天星期几(主要是为了显示日期前面空格填充)
3. 使用mktime()根据给出的时间参数获取对应的时间戳,然后转换成具体的年和月...
代码如下:
1. 首先显示星期(日,一,二,三,四,五,六); 这个很好弄,定义一个数组,使用循环输出就行了
#获取周日到周六
private function weeks()
{
$arr = array('日', '一', '二', '三', '四', '五', '六');
echo "<tr>";
for ($i = 0; $i < count($arr); ++$i) {
echo "<td>" .$arr[$i]. "</td>";
}
echo "</tr>";
}
2. 然后初始化年和月; 创建一个构造函数初始化当前的年和月,和每月第一天的周几和每个月具体的天数
private $year; // 年
private $month; // 月
private $current_week; // 每月份第一天的周几
private $month_day; // 月份的天数
public function __construct()
{
date_default_timezone_set("Asia/Shanghai");
$this->year = isset($_GET['year']) ? $_GET['year'] : date("Y");
$this->month = isset($_GET['month']) ? $_GET['month'] : date("m");
$this->current_week = date("w", mktime(0, 0, 0, $this->month, 1, $this->year) );
$this->month_day = date("t", mktime(0, 0, 0, $this->month, 1, $this->year));
}
小解: w:表示星期中的第几天; t: 表示每个月的实际总天数
3. 开始循环天数,首先确定月份第一天是周几后,输出空格(比如一号是周2,就输出两个空格,依次类推...)
#循环获取天数
private function days()
{
echo "<tr>";
//输出空格
for ($b = 0; $b < $this->current_week; ++$b) {
echo "<td> </td>";
}
//输出天数
for ($a = 1; $a <= $this->month_day; ++$a) {
$b++;
if ($a == date("d")) {
echo "<td style='background:blue;'>" . $a . "</td>";
} else {
echo "<td>" . $a . "</td>";
}
if ($b%7 === 0) {
echo "<tr></tr>";
}
}
echo "</tr>";
}
最后一个初步的日历显示出来了,效果如下:
4. 接着来:显示出当前的年和月;就是把当前的年和月输出即可,然后在年和月上面增加一个超链接(实际操作时ajax异步来处理的)然后点击就进行年和月的切换:
//点击改变年和月
private function changedate()
{
echo "<a href='?".$this->changeYear($this->year, $this->month)."'> <<< </a> ";
echo "<a href='?".$this->changeMonth($this->year, $this->month)."'> << </a> ";
echo $this->year ." ". $this->month;
echo "<a href='?".$this->changeMonthAdd($this->year, $this->month)."'> >> </a>";
echo " <a href='?".$this->changeYearAdd($this->year, $this->month)."'> >>> </a>";
}
在超链接上我是学习别人使用的方法形式。(年份)具体方法如下:
//改变年(减)
private function changeYear($year, $month)
{
$year = $year - 1;
return "year=" . $year . "&month=" . $month;
}
//改变月份(减)
private function changeMonth($year, $month)
{
if ($month == 1 || $month == "01") {
$year = $year - 1;
$month = 12;
} else {
$month--;
}
return "year=" . $year . "&month=" . $month;
}
//改变年(加)
private function changeYearAdd($year, $month)
{
$year = $year + 1;
return "year=" . $year . "&month=" . $month;
}
//改变月份(加)
private function changeMonthAdd($year, $month)
{
if ($month == 12) {
$year = $year + 1;
$month = 1;
} else {
$month++;
}
return "year=" . $year . "&month=" . $month;
}
这里的实现使用了一个简单的小小算法:
1.1 当年份是向后(减)的时候,对当前的年进行减一,然后通过链接以get的方式传递过去,在获取时,通过$_GET超全局数组来获取到传递过来的值,月份同样是如此操作的。
1.2 当月份向后(减)的时候,月份总共12个月,当月份为一月份的时候,对年减一,然后月份为12份,相当于意思就是:年份减一,向后退了一年,月份是12月份。返过来月份相加时,年份加一,月份是一月份。
代码就是上面的四个方法。
整体代码如下:
<?php namespace Admin\Controller;
class IndexController extends \Think\Controller
{
private $year; //年
private $month; //月
private $current_week; //当前月第一天的周几
private $month_day; // 前月的天数
public function __construct()
{
date_default_timezone_set("Asia/Shanghai");
$this->year = isset($_GET['year']) ? $_GET['year'] : date("Y");
$this->month = isset($_GET['month']) ? $_GET['month'] : date("m");
$this->current_week = date("w", mktime(0, 0, 0, $this->month, 1, $this->year) );
$this->month_day = date("t", mktime(0, 0, 0, $this->month, 1, $this->year));
}
public function index()
{
$this->outputs();
}
#输出
private function outputs()
{
echo "<table border='1'>";
$this->changedate();
$this->weeks();
$this->days();
echo "</table>";
}
#获取周日到周六
private function weeks()
{
$arr = array('日', '一', '二', '三', '四', '五', '六');
echo "<tr>";
for ($i = 0; $i < count($arr); ++$i) {
echo "<td>" .$arr[$i]. "</td>";
}
echo "</tr>";
}
#循环获取天数
private function days()
{
echo "<tr>";
for ($b = 0; $b < $this->current_week; ++$b) {
echo "<td> </td>";
}
for ($a = 1; $a <= $this->month_day; ++$a) {
$b++;
if ($a == date("d")) {
echo "<td style='background:blue;'>" . $a . "</td>";
} else {
echo "<td>" . $a . "</td>";
}
if ($b%7 === 0) {
echo "<tr></tr>";
}
}
echo "</tr>";
}
//改变年
private function changeYear($year, $month)
{
$year = $year - 1;
return "year=" . $year . "&month=" . $month;
}
//改变月份
private function changeMonth($year, $month)
{
if ($month == 1 || $month == "01") {
$year = $year - 1;
$month = 12;
} else {
$month--;
}
return "year=" . $year . "&month=" . $month;
}
//改变年
private function changeYearAdd($year, $month)
{
$year = $year + 1;
return "year=" . $year . "&month=" . $month;
}
//改变月份
private function changeMonthAdd($year, $month)
{
if ($month == 12) {
$year = $year + 1;
$month = 1;
} else {
$month++;
}
return "year=" . $year . "&month=" . $month;
}
//点击改变年和月
private function changedate()
{
echo "<a href='?".$this->changeYear($this->year, $this->month)."'> <<< </a> ";
echo "<a href='?".$this->changeMonth($this->year, $this->month)."'> << </a> ";
echo $this->year ." ". $this->month;
echo "<a href='?".$this->changeMonthAdd($this->year, $this->month)."'> >> </a>";
echo " <a href='?".$this->changeYearAdd($this->year, $this->month)."'> >>> </a>";
}
}
最终效果:
样式很丑,没有去调整,整个流程走了一遍,主要是为了学习。相互学习,相互交流;
欢迎一起学习:微信号:zhaoyufengxixi QQ号:1526607040