将时间段按天进行分割

/**
 * 服务:将时间段按天进行分割
 * @param string $start_date @起始日期('Y-m-d H:i:s')
 * @param string $end_date @结束日期('Y-m-d H:i:s')
 * @return array $mix_time_data=array(
 * 'start_date'=>array([N]'Y-m-d H:i:s'),
 * 'end_date'=>array([N]'Y-m-d H:i:s'),
 * 'days_list'=>array([N]'Y-m-d'),
 * 'days_inline'=>array([N]'Y-m-d H:i:s'),
 * 'times_inline'=>array([N]'time()')
 * )
 */
function Date_segmentation($start_date, $end_date)
{
    /******************************* 时间分割 ***************************/

    //如果为空,则从今天的0点为开始时间
    if (!empty($start_date))
        $start_date = date('Y-m-d H:i:s', strtotime($start_date));
    else
        $start_date = date('Y-m-d 00:00:00', time());


    //如果为空,则以明天的0点为结束时间(不存在24:00:00,只会有00:00:00)
    if (!empty($end_date))
        $end_date = date('Y-m-d H:i:s', strtotime($end_date));
    else
        $end_date = date('Y-m-d 00:00:00', strtotime('+1 day'));


    //between 查询 要求必须是从低到高
    if ($start_date > $end_date) {
        $ttt = $start_date;
        $start_date = $end_date;
        $end_date = $ttt;
    } elseif ($start_date == $end_date) {
        echo '时间输入错误';
        die;
    }


    $time_s = strtotime($start_date);
    $time_e = strtotime($end_date);
    $seconds_in_a_day = 86400;

    //生成中间时间点数组(时间戳格式、日期时间格式、日期序列)
    $days_inline_array = array();
    $times_inline_array = array();

    //日期序列
    $days_list = array();
    //判断开始和结束时间是不是在同一天
    $days_inline_array[0] = $start_date;  //初始化第一个时间点
    $times_inline_array[0] = $time_s;     //初始化第一个时间点
    $days_list[] = date('Y-m-d', $time_s);//初始化第一天
    if (
        date('Y-m-d', $time_s)
        == date('Y-m-d', $time_e)
    ) {
        $days_inline_array[1] = $end_date;
        $times_inline_array[1] = $time_e;
    } else {
        /**
         * A.取开始时间的第二天凌晨0点
         * B.用结束时间减去A
         * C.用B除86400取商,取余
         * D.用A按C的商循环+86400,取得分割时间点,如果C没有余数,则最后一个时间点 与 循环最后一个时间点一致
         */
        $A_temp = date('Y-m-d 00:00:00', $time_s + $seconds_in_a_day);
        $A = strtotime($A_temp);
        $B = $time_e - $A;
        $C_quotient = floor($B / $seconds_in_a_day);    //商舍去法取整
        $C_remainder = fmod($B, $seconds_in_a_day);               //余数

        $days_inline_array[1] = $A_temp;
        $times_inline_array[1] = $A;
        $days_list[] = date('Y-m-d', $A);              //第二天
        for ($increase_time = $A, $c_count_t = 1; $c_count_t <= $C_quotient; $c_count_t++) {
            $increase_time += $seconds_in_a_day;
            $days_inline_array[] = date('Y-m-d H:i:s', $increase_time);
            $times_inline_array[] = $increase_time;
            $days_list[] = date('Y-m-d', $increase_time);
        }
        $days_inline_array[] = $end_date;
        $times_inline_array[] = $time_e;
    }

    return array(
        'start_date' => $start_date,
        'end_date' => $end_date,
        'days_list' => $days_list,
        'days_inline' => $days_inline_array,
        'times_inline' => $times_inline_array
    );
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值