PHP日历类

之前做项目的时候需要用到与日历有关的数据,就网上查了一些资料,整合起来写了一个日历类。下面是日历类的源代码以及它的一些用法的demo。

  • 日历类Calendar.php
<?php

/**
 * Class Calendar - 日历类
 */
class Calendar {
    public $months =  array( '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月' );

    /**
     * Calendar constructor.
     * 构造函数
     */
    function __construct(){

    }

    /**
     * @param $year
     * @param $month
     * @return array
     * 参数 $year 必填,参数 $month 选填;
     * 当参数只有一个时,返回 $year 年一整年的日历
     * 当参数为两个时,返回 $year 年 $month 月的日历
     */
    public function getCalendar($year, $month){
        $year = intval($year);
        $month = intval($month);
        $days = array(31, (strtotime("1 Mar " . $year) - strtotime("1 Feb " . $year)) / ( 24 * 60 * 60 ), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        $wday = array( '', '', '', '', '', '', '' );
        $cal = array();

        if($month >= 1 && $month <= 12){
            $firstday = getdate(strtotime($year . '-' . $month . '-' . '1'));
            $fromday = $firstday['wday'];
            $leftday = 7 - ($fromday + $days[$month - 1]) % 7;
            $cal = array_merge(array_slice($wday, 0, $fromday),
                range(1, $days[$month - 1]),
                array_slice($wday, 0, $leftday)
            );

            $data = array(
                'year' => $year,
                'month' => $this->months[$month - 1],
                'cal' => $cal,
            );
        }else {
            foreach (range(0, 11) as $i) {
                $firstday = getdate(strtotime($year . '-' . ($i + 1) . '-' . '1'));
                $fromday = $firstday['wday'];
                $leftday = 7 - ($fromday + $days[$i]) % 7;
                $cal[] = array_merge(array_slice($wday, 0, $fromday),
                    range(1, $days[$i]),
                    array_slice($wday, 0, $leftday)
                );
            }

            $data = array(
                'year' => $year,
                'month' => $this->months,
                'cal' => $cal,
            );
        }

        return $data;
    }

    /**
     * 获取 $year 年的所有周六、周日的日期
     * @param $year
     * @return array
     */
    public function getWeekend($year){
        $first_sat = date('Y-m-d',strtotime('this Saturday', strtotime($year . '-01-01')));
        $sat = array();
        for($i = 0; ; $i += 7){
            $sat_current_time = strtotime($i . ' days', strtotime($first_sat));
            if($sat_current_time > strtotime($year . '-12-31')){
                break;
            }
            $sat[] = date('Y-n-j', $sat_current_time);
        }

        $first_sun = date('Y-m-d',strtotime('this Sunday', strtotime($year . '-01-01')));
        $sun = array();
        for($i = 0; ; $i += 7){
            $sun_current_time = strtotime($i . ' days', strtotime($first_sun));
            if($sun_current_time > strtotime($year . '-12-31')){
                break;
            }
            $sun[] = date('Y-n-j', $sun_current_time);
        }

        $weekend = array(
            'sat' => $sat,
            'sun' => $sun,
        );

        return $weekend;
    }

    /**
     * 求两个日期之间的天数(包括头尾两天);如2016-09-01到2016-09-03为3天
     * (针对1970年1月1日之后,求之前可以采用泰勒公式)
     * @param string $day1
     * @param string $day2
     * @return number
     */
    public function diffBetweenTwoDays ($day1, $day2)
    {
        $second1 = strtotime($day1);
        $second2 = strtotime($day2);

        if ($second1 > $second2) {
            $tmp = $second2;
            $second2 = $second1;
            $second1 = $tmp;
        }
        return ($second2 - $second1) / 86400 + 1;
    }

    /**
     * 返回两个日期之间的日期数组
     * @param $start
     * @param $end
     * @return array
     */
    public function getDatesArray($start, $end){
        $dt_start = strtotime($start);
        $dt_end = strtotime($end);

        if ($dt_start > $dt_end) { //防止开始时间和结束时间写颠倒
            $tmp = $dt_end;
            $dt_end = $dt_start;
            $dt_start = $tmp;
        }

        while ($dt_start <= $dt_end){
            $dateArray[] = date('Y-m-d', $dt_start);
            $dt_start = strtotime('+1 day',$dt_start);
        }

        return $dateArray;
    }
}
  • 调用日历类输出某一年或某一个月的日历demo
<?php
if(isset($_POST['year'])){
    $calendar = new Calendar();
    if(isset($_POST['month'])){
        $data = $calendar->getCalendar($_POST['year'], $_POST['month']); // 输出某一年某一个月的日历
    }else {
        $data = $calendar->getCalendar($_POST['year']); // 输出一整年的日历
    }
    $year = $data['year'];
    $months = $data['month'];
    $cal = $data['cal'];
}
?>
<form method="post" action="">
    <input name="year" value="<?php echo $_POST['year']; ?>" type="text" style="width: 60px;" placeholder="年">&nbsp;<input name="month" type="text" value="<?php echo $_POST['month']; ?>" style="width: 60px;" placeholder="月">&nbsp;<input type="submit" value="提交">
</form>
<?php if(is_array($months)){ ?>
    <div style="width: 750px; position: relative; float: left;">
        <?php foreach(range(0, 11) as $i) : ?>
            <div style="position: relative; float: left; margin-right: 20px; margin-top: 20px; height: 178px; border: 1px silver solid;">
                <table>
                    <thead>
                    <tr><th colspan="7"><?php echo $months[$i].' '.$year.'年'; ?></th></tr>
                    <tr><th></th><th></th><th></th><th></th><th></th><th></th><th></th>
                    </thead>
                    <tbody>
                    <tr>
                        <?php
                        foreach($cal[$i] as $k => $v) {
                            if($k && !($k % 7)){
                                echo "</tr><tr>";
                            }
                            if(($year == date('Y')) && ($i == (date('n') -1)) && ($v == date('j'))) {
                                echo "<td style='color: red;'>$v</td>";
                            }else{
                                echo "<td>$v</td>";
                            }
                        }
                        ?>
                    </tr>
                    </tbody>
                </table>
            </div>
        <?php endforeach ?>
    </div>
<?php }else if(!empty($months)){ ?>
    <div style="position: relative; float: left; margin-right: 20px; margin-top: 20px; height: 178px; border: 1px silver solid;">
        <table>
            <thead>
            <tr><th colspan="7"><?php echo $months.' '.$year.'年'; ?></th></tr>
            <tr><th></th><th></th><th></th><th></th><th></th><th></th><th></th>
            </thead>
            <tbody>
            <tr>
                <?php
                foreach($cal as $k => $v) {
                    if($k && !($k % 7)){
                        echo "</tr><tr>";
                    }
                    echo "<td>$v</td>";
                }
                ?>
            </tr>
            </tbody>
        </table>
    </div>
<?php } ?>

2017年一整年的日历

2017年11月的日历

  • 调用日历类获取某一年的周六周日的日期demo
<form method="post" action="">
    year:<input name="year" value="<?php echo $_POST['year']; ?>" type="text" style="width: 60px;" placeholder="年">&nbsp;<input type="submit" value="提交">
</form>
<?php
if(isset($_POST['year'])){
    $year = $_POST['year'];
    $calendar = new Calendar();
    $weekend = $calendar->getWeekend($year);
    print_r($weekend);
}

2017年整年周六周日日期数组打印结果

  • 调用日历类求两个日期之间的天数(包括头尾两天);如2016-09-01到2016-09-03为3天demo
<form method="post" action="">
    day1:<input name="day1" value="<?php echo $_POST['day1']; ?>" type="text" style="width: 120px;" placeholder="日期1">&nbsp;day1:<input name="day2" value="<?php echo $_POST['day2']; ?>" type="text" style="width: 120px;" placeholder="日期2">&nbsp;<input type="submit" value="提交">
</form>
<?php
if(isset($_POST['day1']) && isset($_POST['day2'])){
    $day1 = $_POST['day1'];
    $day2 = $_POST['day2'];
    $calendar = new Calendar();
    $diff = $calendar->diffBetweenTwoDays($day1, $day2);
    echo $day1 . '到' . $day2 . '为' . $diff . '天';
}
?>

2016-09-01到2016-09-03为3天

  • 返回两个日期之间的日期数组demo
<form method="post" action="">
    day1:<input name="day1" value="<?php echo $_POST['day1']; ?>" type="text" style="width: 120px;" placeholder="日期1">&nbsp;day1:<input name="day2" value="<?php echo $_POST['day2']; ?>" type="text" style="width: 120px;" placeholder="日期2">&nbsp;<input type="submit" value="提交">
</form>
<?php
if(isset($_POST['day1']) && isset($_POST['day2'])){
    $day1 = $_POST['day1'];
    $day2 = $_POST['day2'];
    $calendar = new Calendar();
    $days = $calendar->getDatesArray($day1, $day2);
    print_r($days);
}
?>

返回两个日期之间的日期数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值