关于日期计算的一些PHP封装的辅助函数

17 篇文章 0 订阅

最近项目用到许多关于日期的相关计算,现在整理了一下,供大家参考下,后续慢慢补充……

<?php
    /**
     * 给定一个日期,获取下一天
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getNextDay($date) {
        return date('Y-m-d', strtotime($date. ' +1 day'));
    }
    
    /**
     * 给定一个日期,获取其本月的第一天
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getCurMonthFirstDay($date) {
        return date('Y-m-01', strtotime($date));
    }
    
    /**
     * 给定一个日期,获取其本月的最后一天
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getCurMonthLastDay($date) {
        return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +1 month -1 day'));
    }
    
    /**
     * 给定一个日期,获取其下个月的第一天
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getNextMonthFirstDay($date) {
        return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +1 month'));
    }
    
    /**
     * 给定一个日期,获取其下个月的最后一天
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getNextMonthLastDay($date) {
        return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +2 month -1 day'));
    }
    
    /**
     * 给定一个日期,获取其上个月的第一天
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getPrevMonthFirstDay($date) {
        return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' -1 month'));
    }
    
    /**
     * 给定一个日期,获取其上个的最后一天
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getPrevMonthLastDay($date) {
        return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' -1 day'));
    }

    /**
     * 给定一个日期,获取星期几
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getDayByDate($date){
        return date('N', strtotime($date));
    }

    /**
     * 给定一个日期,获取该日期所在周的星期一日期
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function getMondayInWeekByDate($time){
        $n  = date('N', strtotime($time));
        if($n == 1){
            return $time;
        }else{
            $num = $n-1;
            return date('Y-m-d',strtotime($time.'-'.$num.' day'));
        }
    }

    /**
     * 给定一个日期,获取该日期所在周的周末日期
     * @param string $date 1970-01-01
     * @author sensus
     * @return array
     */
    function getDayByDate($date){
        $n  = date('N', strtotime($date));      
        $sat = 6-$n;
        $sun = 7-$n;
        return array('saturday' => date('Y-m-d',strtotime($date.'+'.$sat.' day')),'sunday' => date('Y-m-d',strtotime($date.'+'.$sun.' day')));
    }

    /**
     * 给定一年年份,判断该年是否为闰年
     * @param string $date 1970
     * @author sensus
     * @return boolean
     */
    function isLeapYear($year){
        // 公历闰年的简单计算方法:(符合以下条件之一的年份即为闰年)
        // 1.能被4整除而不能被100整除.(如2004年就是闰年,1900年不是)
        // 2.能被400整除.(如2000年是闰年)
        if (($year % 4 == 0) && ($year % 100 != 0) || ($year % 400 == 0)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 给定一个日期,距离下一年还有多少天
     * @param string $date 1970-01-01
     * @author sensus
     * @return string
     */
    function howManyDaysDistinceNextYear($data){
        $year = date('Y',strtotime($data));
        $getdate_arr = getdate(strtotime($data));
        if(isLeapYear($year)){//闰年
            return 366-$getdate_arr['yday'];
        }else{//平年
            return 365-$getdate_arr['yday'];
        }
    }

    /**
     * 给定两个日期,算出两个日期之间的所有日期 
     * @param  [type] $start 起始时间
     * @param  [type] $end   结束时间
     * @return array
     */
    function getAllDatesByDoubleDates($start,$end){
        $dt_start = strtotime($start);  
        $dt_end = strtotime($end);  
        if($dt_start > $dt_end){
            $dt_end = strtotime($start);
            $dt_start = strtotime($end);
        }
        while ($dt_start <= $dt_end){  
            $dates[] = date('Y-m-d',$dt_start);  
            $dt_start = strtotime('+1 day',$dt_start);  
        }
        return $dates;   
    }

    /**
     * 给定两个日期,算出两个日期之间相差多少天
     * @param  [type] $start 起始时间
     * @param  [type] $end   结束时间
     * @return string
     */
    function countDaysBetweenDoubleDates($start,$end){
        $dt_start = strtotime($start);  
        $dt_end = strtotime($end);  
        $count = 0;
        if($dt_start > $dt_end){
            $dt_end = strtotime($start);
            $dt_start = strtotime($end);
        }
        while ($dt_start < $dt_end){
            $count++;
            $dt_start = strtotime('+1 day',$dt_start);  
        }
        return $count;   
    }

    /**
     * 获取今年的所有星期几
     * @param  [type] $day 星期几的英文单词(不分大小写)
     * @return string
     */
    function getAllDatesByDay($day = 'monday'){
        $current_year = date('Y');
        $first=date('Y-m-d',strtotime('this '.$day,strtotime($current_year."-01-01")));
        $days = array();
        for($i = 0;;$i += 7){
            $current_time = strtotime($i.' days',strtotime($first));
            if($current_time > strtotime($current_year.'-12-31')){
                break;
            }
            $days[] = date('Y-m-d',$current_time);
        }
        return $days;
    }

    /**
     * 获取交集的时长,两个固定时间段,一个动态时间段,求交集部分时长,如钉钉请假的时长计算
     * @param  [array] $moveTime    [动态时间段],如["09:30", "15:00"]
     * @param  [array] $silentTime1 [固定时间段1],如["09:00", "11:30"]
     * @param  [array] $silentTime2 [固定时间段2],如["13:30", "18:00"]
     * @return [float|null]         [交集时长,单位为小时]
     */
    function getIntersectionAmongThreeTime($moveTime, $silentTime1, $silentTime2) {
        $m1 = strtotime($moveTime[0]);
        $m2 = strtotime($moveTime[1]);
        $a1 = strtotime($silentTime1[0]);
        $a2 = strtotime($silentTime1[1]);
        $b1 = strtotime($silentTime2[0]);
        $b2 = strtotime($silentTime2[1]);
        $amWorkHour = round(($a2 - $a1) / 3600, 2);//上午工作时长,单位为小时
        $pmWorkHour = round(($b2 - $b1) / 3600, 2);//下午工作时长,单位为小时
        $dayWorkHour = $amWorkHour + $pmWorkHour;//每天的工作时长,单位为小时

        if ($m1 <= $a1 && $m2 >= $b2) {
            $intersection = $dayWorkHour;
        } else if ($m1 > $a1 && $m1 < $a2 && $m2 >= $b2) {
            $intersection = round(($a2 - $m1) / 3600, 2) + $pmWorkHour;
        } else if ($m1 >= $a2 && $m1 <= $b1 && $m2 >= $b2) {
            $intersection = $pmWorkHour;
        } else if ($m1 > $b1 && $m1 < $b2 && $m2 >= $b2) {
            $intersection = round(($b2 - $m1) / 3600, 2);
        } else if ($m1 <= $a1 && $m2 > $b1 && $m2 < $b2) {
            $intersection = $amWorkHour + round(($m2 - $b1) / 3600, 2);
        } else if ($m1 <= $a1 && $m2 >= $a2 && $m2 <= $b1) {
            $intersection = $amWorkHour;
        } else if ($m1 <= $a1 && $m2 > $a1 && $m2 < $a2) {
            $intersection = round(($m2 - $a1) / 3600, 2);
        } else if ($m1 > $a1 && $m1 < $a2 && $m2 > $b1 && $m2 < $b2) {
            $intersection = round(($a2 - $m1) / 3600, 2) + round(($m2 - $b1) / 3600, 2);
        } else if ($m1 > $a1 && $m2 < $a2 || $m1 > $b1 && $m2 < $b2) {
            $intersection = round(($m2 - $m1) / 3600, 2);
        } else if ($m1 > $a1 && $m1 < $a2 && $m2 >= $a2 && $m2 <= $b1) {
            $intersection = round(($a2 - $m1) / 3600, 2);
        } else if ($m1 >= $a2 && $m1 <= $b1 && $m2 > $b1 && $m2 < $b2) {
            $intersection = round(($m2 - $b1) / 3600, 2);
        }

        return $intersection;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值