PHP 时间函数

会员活动 循环获取会员日时间

会员活动 循环获取会员日时间并且返回最近一次会员日时间

if (!function_exists('get_circulate_timestamp')) {
    function get_circulate_timestamp($dates, $date_type, $reference_timestamp)
    {
        $timestamp_array = [];
        $format = '';

        switch ($date_type) {
            case 1:
                $format = 'Y-';
                break;
            case 2:
                $format = 'Y-m-';
                break;
            case 3:
                $week = date("w", $reference_timestamp);
                if ($week == 0) {
                    $week = 7;
                }
                $current_time = strtotime(date("Y-m-d", $reference_timestamp));
                break;
            default:
                return [];
        }

        foreach ($dates as $date_info) {
            switch ($date_type) {
                case 1:
                case 2:
                    $timestamp_array[] = strtotime($format . $date_info);
                    break;
                case 3:
                    $timestamp_array[] = $current_time + ($date_info - $week) * 86400;
                    break;
            }
        }

        return $timestamp_array;
    }
}
if (!function_exists('get_time_array')) {
    function get_time_array($dates, $date_type, $reference_timestamp, $compare_timestamp)
    {
        $timestamp_array = get_circulate_timestamp($dates, $date_type, $reference_timestamp);
        $time_array = ['next_begin' => 0, 'nearest_begin' => 0];

        foreach ($timestamp_array as $timestamp) {
            if ($timestamp > $compare_timestamp) {
                $time_array['next_begin'] = ($time_array['next_begin'] == 0 || $timestamp < $time_array['next_begin']) ? $timestamp : $time_array['next_begin'];
            }

            if ($timestamp <= $compare_timestamp) {
                $time_array['nearest_begin'] = ($time_array['nearest_begin'] == 0 || $timestamp > $time_array['nearest_begin']) ? $timestamp : $time_array['nearest_begin'];
            }
        }

        return $time_array;
    }
}

获取日周月年 时间段时间戳

获取当前 日/周/月/年 起始和结束时间戳
获取前一 日/周/月/年 起始和结束时间戳

  function get_period_timestamp($start_time, $period_type = 'daily')
    {

        switch ($period_type) {

            case 'daily':
                //所选时间的昨天起始
                $before_begin = date('Y-m-d 00:00:00', strtotime('-1 day', $start_time));
                $before_end = date('y-m-d 23:59:59', strtotime($before_begin));
                //所选时间的一天起始
                $begin = strtotime(date('Y-m-d', $start_time));
                $end = strtotime(date('Y-m-d 23:59:59', $start_time));
                break;

            case 'weekly':

                //上周一
                if (date('w') == 1) {
                    $before_begin = date('Y-m-d', strtotime('last monday', $start_time)); //无论今天几号,-1 monday为上一个有效周
                } else {
                    $before_begin = date('Y-m-d', strtotime('-1 week last monday', $start_time)); //无论今天几号,-1 monday为上一个有效周
                }

                //上周日
                $before_end = date('Y-m-d  23:59:59', strtotime('-1 sunday', $start_time)); //上一个有效周日,同样适用于其它星期
                //本周一
//                $begin = date('Y-m-d', ($start_time - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)); //w为星期几的数字形式,这里0为周日
                $begin = date('Y-m-d', strtotime('this week Monday', $start_time));
                $end = date('Y-m-d', strtotime('+1week', $begin)) - 1;
                break;

            case 'month':

                //上月一日
                $before_begin = date('Y-m-d', strtotime('-1 month', strtotime(date('Y-m', $start_time) . '-01 00:00:00'))); //本月一日直接strtotime上减一个月
                //上月最后一日
                $before_end = date('Y-m-d  23:59:59', strtotime(date('Y-m', $start_time) . '-01 00:00:00') - 86400); //本月一日减一天即是上月最后一日

                //所选时间的月起始
                $begin = date('Y-m-d', strtotime(date('Y-m', $start_time) . '-01 00:00:00')); //直接以strtotime生成
                $begin = date('Y-m-d', strtotime(date('Y-m-01', $start_time)));
                $end = date('Y-m-d', strtotime('+1month', $begin)) - 1;
                break;

            case 'year':

                //去年一月一日
                $before_begin = date('Y-m-d', strtotime('-1 year', strtotime(date('Y', $start_time) . '-01-01 00:00:00'))); //本月一日直接strtotime上减一个月
                //去年十二月三十一日
                $before_end = date('Y-m-d  23:59:59', strtotime(date('Y', $start_time) . '-01-01 00:00:00') - 1); //本月一日减一天即是上月最后一日


                //所选时间的年起始\

                $begin = date('Y-m-d', strtotime(date('Y-01-01', $start_time)));
                $end = date('Y-m-d', strtotime('+1year', $begin)) - 1;

                break;

            default:
                return build_result('类型错误 :daily,weekly,month,year');
        }

        $result = [
            'before_begin' => $before_begin,
            'before_end' => $before_end,
            'begin' => $begin,
            'end' => $end
        ];
        return build_result('查询成功', 0, $result);
    }
本作品采用《CC 协议》,转载必须注明作者和本文链接
附言 1  ·  3个月前

改进后
function get_period_timestamp($start_time, $period_type = 'daily')
{

    switch ($period_type) {

        case "daily":
            //所选时间的昨天起始
            $before_begin = date("Y-m-d 00:00:00", strtotime("-1 day", $start_time));
            $before_end = date("y-m-d 23:59:59", strtotime($before_begin));
            //所选时间的一天起始
            $begin = strtotime(date("Y-m-d", $start_time));
            $end = strtotime(date("Y-m-d 23:59:59", $start_time));
            break;

        case "weekly":

            //上周一
            if (date("w") == 1) {
                $before_begin = date("Y-m-d", strtotime("last monday", $start_time)); //无论今天几号,-1 monday为上一个有效周
            } else {
                $before_begin = date("Y-m-d", strtotime("-1 week last monday", $start_time)); //无论今天几号,-1 monday为上一个有效周
            }

            //上周日
            $before_end = date("Y-m-d  23:59:59", strtotime("-1 sunday", $start_time)); //上一个有效周日,同样适用于其它星期
            //本周一

// $begin = date("Y-m-d", ($start_time - ((date("w") == 0 ? 7 : date("w")) - 1) 24 3600)); //w为星期几的数字形式,这里0为周日
$begin = date("Y-m-d", strtotime("this week Monday", $start_time));
$end = date("Y-m-d", strtotime('+1week', $begin)) - 1;
break;

        case "month":
            //上月一日
            $before_begin = date("Y-m-d",strtotime("first day of -1 month",$start_time));
            //上月最后一日
            $before_end = date("Y-m-d  23:59:59",strtotime("last day of -1 month",$start_time));

            //所选时间的月起始
            $begin = date("Y-m-d", strtotime(date("Y-m", $start_time) . "-01 00:00:00")); //直接以strtotime生成
            $begin = date("Y-m-d", strtotime(date("Y-m-01", $start_time)));
            $end = date("Y-m-d", strtotime('+1month', $begin)) - 1;
            break;

        case "year":

            //去年一月一日
            $before_begin = date("Y-m-d", strtotime("-1 year", strtotime(date("Y", $start_time) . '-01-01 00:00:00'))); //本月一日直接strtotime上减一个月
            //去年十二月三十一日
            $before_end = date("Y-m-d  23:59:59", strtotime(date("Y", $start_time) ."-01-01 00:00:00") - 1); //本月一日减一天即是上月最后一日

            //所选时间的年起始

            $begin = date("Y-m-d", strtotime(date("Y-01-01", $start_time)));
            $end = date("Y-m-d", strtotime('+1year', $begin)) - 1;

            break;
        default:
            return build_result('类型错误 :daily,weekly,month,year');
    }

    $result = [
        "before_begin" => $before_begin,
        "before_end" => $before_end,
        "begin" => $begin,
        "end" => $end
    ];
    return build_result('查询成功', 0, $result);
}
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7
aab

这代码看到头皮发麻

3个月前 评论
半人间 3个月前
VeryAUX (楼主) 3个月前

抛开逻辑不谈;需要优化的两点: 1、字符串既有单引号的,也有双引号的。 2、硬编码数字(如:1、2、3、...),最好是单独定义成释义的常量。

3个月前 评论
VeryAUX (楼主) 3个月前

用到strtotime最好看看鸟哥的这篇文章

www.laruence.com/2018/07/31/3207.h...

3个月前 评论
VeryAUX (楼主) 3个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!