• PHP实现的一个时间帮助类


    背景

    工作的过程中经常会遇到各种时间类的操作,因此封装了一个帮助工具类,提高代码的复用率

    主要功能

    根据相差的天数获取连续的时间段

    
    /**
         * 根据相差的天数获取所有连续的时间段
         * @param $diffDay
         * @param string $dateFormat
         * @return array
         */
        public static function getContinuesDayDiffDay($diffDay, $dateFormat = 'Y-m-d') {
            $today = date('Y-m-d');
            $timeLabel = [];
            for ($i=1;$i<=$diffDay;$i++){
                $diff = $diffDay - $i;
                $mday = date($dateFormat,strtotime("$today -$diff day"));
                array_push($timeLabel,$mday);
            }
            //转化查询条件
            $year = date('Y');
            $startDay = str_replace('.','-',$timeLabel[0]);
            $endDay = str_replace('.','-',$timeLabel[$diffDay-1]);
            $startTime = strtotime($startDay." 00:00:00");
            $endTime = strtotime($endDay." 23:59:59");
            return [
                'start_time' => $startTime,
                'end_time' => $endTime,
                'time_label' => $timeLabel,
            ];
        }
    

    根据两个日期获取连续的时间段

    
    /**
         * 根据开始和结束时间获取所有连续的时间段
         * @param string $startDay 开始日期 格式:Y-m-d
         * @param string $endDay 开始日期 格式:Y-m-d
         * @param string $dateFormat
         * @return array
         */
        public static function getContinuesDayByRange($startDay, $endDay, $dateFormat = 'Y-m-d') {
            $timeLabel = [];
            if(strtotime($startDay) > strtotime($endDay)){
                $tmp = $startDay;
                $endDay = $tmp;
                $startDay = $endDay;
            }
            if($startDay == $endDay){
                array_push($timeLabel,$startDay);
    
                $startTime = strtotime($startDay." 00:00:00");
                $endTime = strtotime($endDay." 23:59:59");
                $timeLabel =  [
                    'start_time' => $startTime,
                    'end_time' => $endTime,
                    'time_label' => $timeLabel,
                ];
                return $timeLabel;
            }
    
            $targetDay = $startDay;
            while ($targetDay != $endDay){
                array_push($timeLabel,$targetDay);
                $targetDay = date($dateFormat,strtotime("$targetDay +1 day"));
            }
    
            array_push($timeLabel,$endDay);
    
            //增加
            $startTime = strtotime($startDay." 00:00:00");
            $endTime = strtotime($endDay." 23:59:59");
            $timeLabel =  [
                'start_time' => $startTime,
                'end_time' => $endTime,
                'time_label' => $timeLabel,
            ];
            return $timeLabel;
        }
    

    根据日期获取当月的开始时间和结束时间

    
     /**
         * 根据日期获取本月的开始时间和结束时间
         * @param $date   Y-m    2017-10
         * @return array
         */
        public static function getMonthDaysByDate($date) {
            $data = [];
            $timestamp = strtotime( $date );
            $data['start_time'] = date( 'Y-m-01 00:00:00', $timestamp );
            $mdays = date( 't', $timestamp );
            $data['end_time'] = date( 'Y-m-' . $mdays . ' 23:59:59', $timestamp );
            return $data;
        }
    

    时间友好格式化风格

    
    /**
         * 时间友好型提示风格化(即微博中的XXX小时前、昨天等等)
         * 即微博中的 XXX 小时前、昨天等等, 时间超过 $time_limit 后返回按 out_format 的设定风格化时间戳
         * @param  int
         * @param  int
         * @param  string
         * @param  array
         * @param  int
         * @return string
         */
        public static function getFriendlyTime($timestamp, $timeLimit = 604800, $out_format = 'Y/m/d', $formats = null, $now = null){
            /*if (get_setting('time_style') == 'N')
            {
                return date($out_format, $timestamp);
            }*/
    
            if (!$timestamp)
            {
                return false;
            }
    
            if ($formats == null)
            {
                $formats = [
                    'YEAR' =>'%s 年前',
                    'MONTH' => '%s 月前',
                    'DAY' => '%s 天前',
                    'HOUR' => '%s 小时前',
                    'MINUTE' => '%s 分钟前',
                    'SECOND' => '%s 秒前'
                ];
            }
    
            $now = $now == null ? time() : $now;
            $seconds = $now - $timestamp;
    
            if ($seconds == 0)
            {
                $seconds = 1;
            }
    
            if (!$timeLimit OR $seconds > $timeLimit)
            {
                return date($out_format, $timestamp);
            }
    
            $minutes = floor($seconds / 60);
            $hours = floor($minutes / 60);
            $days = floor($hours / 24);
            $months = floor($days / 30);
            $years = floor($months / 12);
    
            if ($years > 0)
            {
                $diffFormat = 'YEAR';
            }
            else
            {
                if ($months > 0)
                {
                    $diffFormat = 'MONTH';
                }
                else
                {
                    if ($days > 0)
                    {
                        $diffFormat = 'DAY';
                    }
                    else
                    {
                        if ($hours > 0)
                        {
                            $diffFormat = 'HOUR';
                        }
                        else
                        {
                            $diffFormat = ($minutes > 0) ? 'MINUTE' : 'SECOND';
                        }
                    }
                }
            }
    
            $dateDiff = null;
    
            switch ($diffFormat)
            {
                case 'YEAR' :
                    $dateDiff = sprintf($formats[$diffFormat], $years);
                    break;
                case 'MONTH' :
                    $dateDiff = sprintf($formats[$diffFormat], $months);
                    break;
                case 'DAY' :
                    $dateDiff = sprintf($formats[$diffFormat], $days);
                    break;
                case 'HOUR' :
                    $dateDiff = sprintf($formats[$diffFormat], $hours);
                    break;
                case 'MINUTE' :
                    $dateDiff = sprintf($formats[$diffFormat], $minutes);
                    break;
                case 'SECOND' :
                    $dateDiff = sprintf($formats[$diffFormat], $seconds);
                    break;
            }
    
            return $dateDiff;
        }
    

    根据日期获取是星期几

    
    /**
         * 获取星期几
         * @param $date
         * @return
         */
        public static function getWeekDay($date) {
            //强制转换日期格式
            $dateStr=date('Y-m-d',strtotime($date));
            //封装成数组
            $arr=explode("-", $dateStr);
            //参数赋值
            //年
            $year=$arr[0];
    
            //月,输出2位整型,不够2位右对齐
            $month=sprintf('%02d',$arr[1]);
            //日,输出2位整型,不够2位右对齐
            $day=sprintf('%02d',$arr[2]);
    
            //时分秒默认赋值为0;
            $hour = $minute = $second = 0;
    
            //转换成时间戳
            $strap = mktime($hour,$minute,$second,$month,$day,$year);
    
            //获取数字型星期几
            $numberWk=date("w",$strap);
    
            //自定义星期数组
            $weekArr=array(7,1,2,3,4,5,6);
    
            //获取数字对应的星期
            return $weekArr[$numberWk];
        }
    

    获取指定日期前后相同时间天数的时间范围

    
    /**
         * 获取指定日期前后相同时间天数的范围时间
         * @param int $dayDiff
         * @param string $day
         * @param string $dateFormat
         * @return array
         */
        public static function getPointDaySameRangeContinuesTime($dayDiff = 0,$day = "", $dateFormat = "Y-m-d") {
            $day = $day?$day:date($dateFormat);
            $startTime = date($dateFormat,strtotime("$day -$dayDiff day"));
            $endTime = date($dateFormat,strtotime("$day +$dayDiff day"));
            $result = self::getContinuesDayByRange($startTime,$endTime,$dateFormat = 'Y-m-d');
            return $result;
        }
    

    获取两个日期之间相差的天数

    
    /**
         * 获取两个日期之间相差的天数
         * @param string $day1 第一个日期,格式为Y-m-d
         * @param string $day2 第二个日期,格式为Y-m-d
         * @return integer
         */
        public static function getDiffBetweenTwoDays($day1, $day2) {
            $second1 = strtotime($day1);
            $second2 = strtotime($day2);
            if ($second1 < $second2) {
                $tmp = $second2;
                $second2 = $second1;
                $second1 = $tmp;
            }
            return ($second1 - $second2) / 86400;
        }
    

    根据指定日期和天数,获取结束的日期

    
    /**
         * 根据日期和相差的天数获取结束的天数
         * @param $day
         * @param $diffDay
         * @param bool $isBefore
         * @return false|string
         */
        public static function getEndDayByDayAndDiff($day, $diffDay, $isBefore = false) {
            $operator = $isBefore ? "-" : "+";
            $endDay = date('Y-m-d',strtotime("$day $operator $diffDay day"));
            return $endDay;
        }
    

    判断两个日期是否为同一天

    
    /**
         * 判断两个时间是否同一天
         * @param string $date1 Y-m-d
         * @param string $date2 Y-m-d
         * @return bool
         */
        public static function isSameDay($date1, $date2) {
            $day1 = self::dateTime(strtotime($date1)) ;
            $day2 = self::dateTime(strtotime($date2));
            return $day1 == $day2;
        }
    

    转换秒钟为分钟

    
    /**
         * 转换秒钟为分钟
         * @param $seconds
         * @return string
         */
        public static function convertSecondToTime($seconds) {
            $reminded = strval($seconds % 60);
            $minute = strval(($seconds - $reminded) / 60);
            if(strlen($minute)<2){
                $minute = '0'.$minute;
            }
            if(strlen($reminded)<2){
                $reminded = '0'.$reminded;
            }
            $time = $minute.":".$reminded;
            return $time;
        }
    

    获取毫秒数

    
    /**
         * 获取时间的毫秒数
         * @return float
         */
        public static function millisecond() {
            list($msec, $sec) = explode(' ', microtime());
            return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        }
    

    附录:完整的时间帮助类代码

    
    <?php
    /**
     * Created by PhpStorm.
     * User: Auser
     * Date: 2017/7/16
     * Time: 20:47
     */
    
    namespace AppHttpHelper;
    
    
    use IlluminateSupportFacadesInput;
    use InterventionImageFacadesImage;
    use MockeryException;
    
    class TimeHelper
    {
        /**
         * 根据相差的天数获取所有连续的时间段
         * @param $diffDay
         * @param string $dateFormat
         * @return array
         */
        public static function getContinuesDayDiffDay($diffDay, $dateFormat = 'Y-m-d') {
            $today = date('Y-m-d');
            $timeLabel = [];
            for ($i=1;$i<=$diffDay;$i++){
                $diff = $diffDay - $i;
                $mday = date($dateFormat,strtotime("$today -$diff day"));
                array_push($timeLabel,$mday);
            }
            //转化查询条件
            $year = date('Y');
            $startDay = str_replace('.','-',$timeLabel[0]);
            $endDay = str_replace('.','-',$timeLabel[$diffDay-1]);
            $startTime = strtotime($startDay." 00:00:00");
            $endTime = strtotime($endDay." 23:59:59");
            return [
                'start_time' => $startTime,
                'end_time' => $endTime,
                'time_label' => $timeLabel,
            ];
        }
    
        /**
         * 根据开始和结束时间获取所有连续的时间段
         * @param string $startDay 开始日期 格式:Y-m-d
         * @param string $endDay 开始日期 格式:Y-m-d
         * @param string $dateFormat
         * @return array
         */
        public static function getContinuesDayByRange($startDay, $endDay, $dateFormat = 'Y-m-d') {
            $timeLabel = [];
            if(strtotime($startDay) > strtotime($endDay)){
                $tmp = $startDay;
                $endDay = $tmp;
                $startDay = $endDay;
            }
            if($startDay == $endDay){
                array_push($timeLabel,$startDay);
    
                $startTime = strtotime($startDay." 00:00:00");
                $endTime = strtotime($endDay." 23:59:59");
                $timeLabel =  [
                    'start_time' => $startTime,
                    'end_time' => $endTime,
                    'time_label' => $timeLabel,
                ];
                return $timeLabel;
            }
    
            $targetDay = $startDay;
            while ($targetDay != $endDay){
                array_push($timeLabel,$targetDay);
                $targetDay = date($dateFormat,strtotime("$targetDay +1 day"));
            }
    
            array_push($timeLabel,$endDay);
    
            //增加
            $startTime = strtotime($startDay." 00:00:00");
            $endTime = strtotime($endDay." 23:59:59");
            $timeLabel =  [
                'start_time' => $startTime,
                'end_time' => $endTime,
                'time_label' => $timeLabel,
            ];
            return $timeLabel;
        }
    
        /**
         * 根据日期获取本月的开始时间和结束时间
         * @param $date   Y-m    2017-10
         * @return array
         */
        public static function getMonthDaysByDate($date) {
            $data = [];
            $timestamp = strtotime( $date );
            $data['start_time'] = date( 'Y-m-01 00:00:00', $timestamp );
            $mdays = date( 't', $timestamp );
            $data['end_time'] = date( 'Y-m-' . $mdays . ' 23:59:59', $timestamp );
            return $data;
        }
    
        /**
         * 获取两个月份之间连续的月份
         * @param $start
         * @param $end
         * @return array
         */
        public static function  prDates($start, $end) { // 两个日期之间的所有日期
            $time_start = strtotime($start); // 自动为00:00:00 时分秒 两个时间之间的年和月份
            $time_end = strtotime($end);
            $monarr[] = $start; // 当前月;
            while( ($time_start = strtotime('+1 month', $time_start)) <= $time_end){
                array_push($monarr,date('Y-m', $time_start));// 取得递增月
            }
            return $monarr;
        }
    
    
        /**
         * 时间友好型提示风格化(即微博中的XXX小时前、昨天等等)
         * 即微博中的 XXX 小时前、昨天等等, 时间超过 $time_limit 后返回按 out_format 的设定风格化时间戳
         * @param  int
         * @param  int
         * @param  string
         * @param  array
         * @param  int
         * @return string
         */
        public static function getFriendlyTime($timestamp, $timeLimit = 604800, $out_format = 'Y/m/d', $formats = null, $now = null){
            /*if (get_setting('time_style') == 'N')
            {
                return date($out_format, $timestamp);
            }*/
    
            if (!$timestamp)
            {
                return false;
            }
    
            if ($formats == null)
            {
                $formats = [
                    'YEAR' =>'%s 年前',
                    'MONTH' => '%s 月前',
                    'DAY' => '%s 天前',
                    'HOUR' => '%s 小时前',
                    'MINUTE' => '%s 分钟前',
                    'SECOND' => '%s 秒前'
                ];
            }
    
            $now = $now == null ? time() : $now;
            $seconds = $now - $timestamp;
    
            if ($seconds == 0)
            {
                $seconds = 1;
            }
    
            if (!$timeLimit OR $seconds > $timeLimit)
            {
                return date($out_format, $timestamp);
            }
    
            $minutes = floor($seconds / 60);
            $hours = floor($minutes / 60);
            $days = floor($hours / 24);
            $months = floor($days / 30);
            $years = floor($months / 12);
    
            if ($years > 0)
            {
                $diffFormat = 'YEAR';
            }
            else
            {
                if ($months > 0)
                {
                    $diffFormat = 'MONTH';
                }
                else
                {
                    if ($days > 0)
                    {
                        $diffFormat = 'DAY';
                    }
                    else
                    {
                        if ($hours > 0)
                        {
                            $diffFormat = 'HOUR';
                        }
                        else
                        {
                            $diffFormat = ($minutes > 0) ? 'MINUTE' : 'SECOND';
                        }
                    }
                }
            }
    
            $dateDiff = null;
    
            switch ($diffFormat)
            {
                case 'YEAR' :
                    $dateDiff = sprintf($formats[$diffFormat], $years);
                    break;
                case 'MONTH' :
                    $dateDiff = sprintf($formats[$diffFormat], $months);
                    break;
                case 'DAY' :
                    $dateDiff = sprintf($formats[$diffFormat], $days);
                    break;
                case 'HOUR' :
                    $dateDiff = sprintf($formats[$diffFormat], $hours);
                    break;
                case 'MINUTE' :
                    $dateDiff = sprintf($formats[$diffFormat], $minutes);
                    break;
                case 'SECOND' :
                    $dateDiff = sprintf($formats[$diffFormat], $seconds);
                    break;
            }
    
            return $dateDiff;
        }
    
    
        /**
         * 获取星期几
         * @param $date
         * @return
         */
        public static function getWeekDay($date) {
            //强制转换日期格式
            $dateStr=date('Y-m-d',strtotime($date));
            //封装成数组
            $arr=explode("-", $dateStr);
            //参数赋值
            //年
            $year=$arr[0];
    
            //月,输出2位整型,不够2位右对齐
            $month=sprintf('%02d',$arr[1]);
            //日,输出2位整型,不够2位右对齐
            $day=sprintf('%02d',$arr[2]);
    
            //时分秒默认赋值为0;
            $hour = $minute = $second = 0;
    
            //转换成时间戳
            $strap = mktime($hour,$minute,$second,$month,$day,$year);
    
            //获取数字型星期几
            $numberWk=date("w",$strap);
    
            //自定义星期数组
            $weekArr=array(7,1,2,3,4,5,6);
    
            //获取数字对应的星期
            return $weekArr[$numberWk];
        }
    
        /**
         * 获取指定日期前后相同时间天数的范围时间
         * @param int $dayDiff
         * @param string $day
         * @param string $dateFormat
         * @return array
         */
        public static function getPointDaySameRangeContinuesTime($dayDiff = 0,$day = "", $dateFormat = "Y-m-d") {
            $day = $day?$day:date($dateFormat);
            $startTime = date($dateFormat,strtotime("$day -$dayDiff day"));
            $endTime = date($dateFormat,strtotime("$day +$dayDiff day"));
            $result = self::getContinuesDayByRange($startTime,$endTime,$dateFormat = 'Y-m-d');
            return $result;
        }
    
        /**
         * 获取两个日期之间相差的天数
         * @param string $day1 第一个日期,格式为Y-m-d
         * @param string $day2 第二个日期,格式为Y-m-d
         * @return integer
         */
        public static function getDiffBetweenTwoDays($day1, $day2) {
            $second1 = strtotime($day1);
            $second2 = strtotime($day2);
            if ($second1 < $second2) {
                $tmp = $second2;
                $second2 = $second1;
                $second1 = $tmp;
            }
            return ($second1 - $second2) / 86400;
        }
    
        /**
         * 根据日期和相差的天数获取结束的天数
         * @param $day
         * @param $diffDay
         * @param bool $isBefore
         * @return false|string
         */
        public static function getEndDayByDayAndDiff($day, $diffDay, $isBefore = false) {
            $operator = $isBefore ? "-" : "+";
            $endDay = date('Y-m-d',strtotime("$day $operator $diffDay day"));
            return $endDay;
        }
    
        /**
         * 根据时间戳返回日期型时间戳
         * @param $time
         * @return int
         */
        public static function dateTime($time) {
            return strtotime(date('Y-m-d', $time));
        }
    
        /**
         * @param $num
         * @return string
         */
        public static function getFriendlyNumber($num) {
            if ($num >= 10000) {
                $num = round($num / 10000 ,1)  .'万';
            } else {
                $num = $num;
            }
            return $num;
        }
    
        /**
         * 判断两个时间是否同一天
         * @param string $date1 Y-m-d
         * @param string $date2 Y-m-d
         * @return bool
         */
        public static function isSameDay($date1, $date2) {
            $day1 = self::dateTime(strtotime($date1)) ;
            $day2 = self::dateTime(strtotime($date2));
            return $day1 == $day2;
        }
    
    
        /**
         * 转换秒钟为分钟
         * @param $seconds
         * @return string
         */
        public static function convertSecondToTime($seconds) {
            $reminded = strval($seconds % 60);
            $minute = strval(($seconds - $reminded) / 60);
            if(strlen($minute)<2){
                $minute = '0'.$minute;
            }
            if(strlen($reminded)<2){
                $reminded = '0'.$reminded;
            }
            $time = $minute.":".$reminded;
            return $time;
        }
    
        /**
         * 获取时间的毫秒数
         * @return float
         */
        public static function millisecond() {
            list($msec, $sec) = explode(' ', microtime());
            return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        }
    }
    

    来源:https://segmentfault.com/a/1190000017512325

  • 相关阅读:
    【255】◀▶IEW-Unit20
    【254】◀▶IEW-Unit19
    【253】◀▶IEW-Unit18
    【252】◀▶IEW-Unit17
    [LeetCode] Restore IP Address
    1030
    (Relax 数论1.8)POJ 1284 Primitive Roots(欧拉函数的应用: 以n为模的本原根的个数phi(n-1))
    新知识的遗忘数度真是可怕
    【自由谈】城域网IPv6过渡技术——4v6场景技术总结(1)
    Graph Databases—The NOSQL Phenomenon阅读笔记
  • 原文地址:https://www.cnblogs.com/lalalagq/p/10229191.html
Copyright © 2020-2023  润新知