资讯专栏INFORMATION COLUMN

PHP实现的一个时间帮助类

ky0ncheng / 2354人阅读

摘要:背景工作的过程中经常会遇到各种时间类的操作,因此封装了一个帮助工具类,提高代码的复用率主要功能根据相差的天数获取连续的时间段根据相差的天数获取所有连续的时间段转化查询条件根据两个日期获取连续的时间段根据开始和结束时间获取所

背景

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

主要功能 根据相差的天数获取连续的时间段
/**
     * 根据相差的天数获取所有连续的时间段
     * @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);
    }
附录:完整的时间帮助类代码
 $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://www.ucloud.cn/yun/29854.html

相关文章

  • PHP生成器

    摘要:它最简单的调用形式看起来像一个申明,不同之处在于普通会返回值并终止函数的执行,而会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。 0x01 写在前面 本文主要介绍: Generator的简单用法。 Generator的底层实现。 本文比较长,可能会耗费你比较多的时间。如果你比较了解Generator的用法,仅想了解底层实现,可以直接跳到底层实现部分。 本文分析的PH...

    LMou 评论0 收藏0
  • PHP应用性能优化指南

    摘要:怎样才算是高性能的应用性能和速度不是一对同义词。红线表示针对速度进行了优化的脚本,蓝线是可扩展性优先的脚本。将任何这些功能置于循环中可能会导致性能问题。完整的代码检测评估虽然可能很耗时,但它可以为你提供有关应用程序性能的深入信息。 showImg(https://segmentfault.com/img/bVNxDn?w=900&h=500);程序员都喜欢最新的PHP 7,因为它使PH...

    EddieChan 评论0 收藏0
  • 成为一个PHP专家:缺失环节

    摘要:为了成为一个专家,他必须先成为中级者。它非常适合于急于求成或者没有太多技术的人,但掌握绝对无法使你成为一个专业的开发者它使用意大利面条式的编码,教你的是不合适的设计原则。 这一篇文章是Becoming a PHP Professional系列 4 篇博文中的第 1 篇。 当浏览各类与PHP相关的博客时,比如Quora上的问题,谷歌群组,简讯和杂志,我经常注意到技能的等级分化。问题都类...

    cooxer 评论0 收藏0
  • PHP实现微信小程序支付帮助

    摘要:背景事先准备工作申请一个小程序,并开通微信支付,详细见微信小程序支付业务说明仔细查阅微信支付官方文档,详细见微信支付开发者文档仔细阅读微信支付统一下单接口仔细阅读支付结果通知接口整理并在商户平台设置好相应的回掉地址,比如服务端编写两个接口微 背景 事先准备工作 申请一个小程序,并开通微信支付,详细见:微信小程序支付业务说明 仔细查阅微信支付官方文档,详细见: 微信支付开发者文档 ...

    mcterry 评论0 收藏0
  • 一个 16年毕业生所经历 PHP 面试

    摘要:正确做法是给加索引,还有联合索引,并不能避免全表扫描。 前言:有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连 有心的同学应该会看到我这个noteBook下面的其它知识,希望对你们有些许帮助。 本文地址 时间点:2017-11 一个16年毕业生所经历的php面试 一、什么是面试 二、面试准备 1. 问:什么时候开始准备? 2. 问:怎么准备? 三、面试...

    dabai 评论0 收藏0

发表评论

0条评论

ky0ncheng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<