PHP把一段时间处理成分时间段数组(带有名称及截止时间)

背景:做数据分析时不免会有对于时间段的划分与分组查询处理数据,时间段的分段处理也很闹人,经过几次麻烦之后,自己做了一个小小的时间处理函数。

说明:只需把开始和截止时间放入,就会返回时间段数组,可以根据不同的需求加以修改即可,不错的函数呦。

代码段:

  
  
public function timeArrayProcess($startTime, $endTime) {
$format = "Y-m-d H:i:s";
$timeLength = date_diff(date_create($startTime), date_create($endTime));
//echo $diff->format("%a days");
$s_stamp = strtotime($startTime);
$e_stamp = strtotime($endTime);
$time_arr = array();
if ($timeLength->days <= 1) {
$type = "hour";
} elseif (($timeLength->days > 1) and ($timeLength->days <= 31)) {
$type = "day";
} elseif (($timeLength->days > 31) and ($timeLength->days <= 92)) {
$type = "week";
} elseif (($timeLength->days > 92) and ($timeLength->days <= 730)) {
$type = "month";
} else {
$type = "year";
}
switch ($type) {
case hour:
$start = date('Y-m-d H:00:00', strtotime($startTime));
$end = date('Y-m-d H:00:00', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
$ns_stamp = $s_stamp;
} else {
$i = 1;
$time_arr[0][x] = date('y-m-d H', $s_stamp) . "时";
$time_arr[0][start] = date($format, $s_stamp);
$ns_stamp+=3599;
$time_arr[0][end] = date($format, $ns_stamp);
$ns_stamp+=1;
}
while ($ns_stamp < $ne_stamp) {
$time_arr[$i][x] = date('y-m-d H', $ns_stamp) . "时";
$time_arr[$i][start] = date($format, $ns_stamp);
$ns_stamp+=3599;
//if ($ns_stamp < $ne_stamp) {
$time_arr[$i][end] = date($format, $ns_stamp);
$ns_stamp+=1;
$i++;
//} else {
//break;
// }
}
$e_stamp-=1;
if ($ne_stamp < $e_stamp) {
$time_arr[$i][x] = date('y-m-d H', $ne_stamp) . "时";
$time_arr[$i][start] = date($format, $ne_stamp);
$time_arr[$i][end] = date($format, $e_stamp);
}
break;
case day:
$start = date('Y-m-d', strtotime($startTime));
$end = date('Y-m-d', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
} else {
$i = 1;
$time_arr[0][x] = date('y-m-d', $s_stamp);
$time_arr[0][start] = date($format, $s_stamp);
$ns_stamp+=86399;
$time_arr[0][end] = date($format, $ns_stamp);
$ns_stamp+=1;
}//$ne_stamp = $e_stamp;
while ($ns_stamp < $ne_stamp) {
$time_arr[$i][x] = date('y-m-d', $ns_stamp);
$time_arr[$i][start] = date($format, $ns_stamp);
$ns_stamp+=86399;
if ($ns_stamp < $ne_stamp) {
$time_arr[$i][end] = date($format, $ns_stamp);
$ns_stamp+=1;
$i++;
}
}
$e_stamp-=1;
//if ($ne_stamp < $e_stamp) {
$time_arr[$i][x] = date('y-m-d', $ns_stamp);
$time_arr[$i][start] = date($format, $ns_stamp);
$time_arr[$i][end] = date($format, $e_stamp);
//}
break;
case week:
$start = date('Y-m-d', strtotime($startTime));
$end = date('Y-m-d', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
} else {
$i = 1;
$time_arr[0][x] = date('y-m-d', $s_stamp);
$time_arr[0][start] = date($format, $s_stamp);
$w = date('N', strtotime($time_arr[0][start]));
$ns_stamp+=(8 - $w ) * 86400 - 1;
$time_arr[0][end] = date($format, $ns_stamp);
$arr = array(date('y-m-d', strtotime($time_arr[0][start])), date('y-m-d', strtotime($time_arr[0][end])));
$time_arr[0][x] = implode("~", $arr);
$ns_stamp+=1;
}
//$ne_stamp = $e_stamp;
while ($ns_stamp < $ne_stamp) {
$time_arr[$i][x] = date('y-m-d', $ns_stamp);
$time_arr[$i][start] = date($format, $ns_stamp);
$ns_stamp+=604799; //(7 * 86400 - 1)
if ($ns_stamp < $ne_stamp) {
$time_arr[$i][end] = date($format, $ns_stamp);
$arr = array(date('y-m-d', strtotime($time_arr[$i][start])), date('y-m-d', strtotime($time_arr[$i][end])));
$time_arr[$i][x] = implode("~", $arr);
$ns_stamp+=1;
$i++;
} /* else {
break;
} */
}
$e_stamp-=1;
//if ($ne_stamp < $e_stamp) {
$time_arr[$i][end] = date($format, $e_stamp);
$arr = array(date('y-m-d', strtotime($time_arr[$i][start])), date('y-m-d', strtotime($time_arr[$i][end])));
$time_arr[$i][x] = implode("~", $arr);
//}
break;
case month:
$start = date('Y-m', strtotime($startTime));
$end = date('Y-m', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
$ns_stamp = $s_stamp;
} else {
$i = 1;
$time_arr[0][x] = date('Y-m', $s_stamp);
$time_arr[0][start] = date($format, $s_stamp);
$num = date("t", $s_stamp);
$ns_stamp+=$num * 86400 - 1;
$time_arr[0][end] = date($format, $ns_stamp);
$ns_stamp+=1;
}
while ($ns_stamp < $ne_stamp) {//这里累加每个月的的总秒数 计算公式:上一月1号的时间戳秒数减去当前月的时间戳秒数
$time_arr[$i][x] = date('Y-m', $ns_stamp);
$time_arr[$i][start] = date($format, strtotime($time_arr[$i][x]));
$num = date("t", $ns_stamp);
$ns_stamp+=$num * 86400 - 1;
$time_arr[$i][end] = date($format, $ns_stamp);
$ns_stamp+=1;
$i++;
}
$e_stamp-=1;
//if ($ne_stamp < $e_stamp) {
$time_arr[$i][x] = date('Y-m', $ne_stamp);
$time_arr[$i][start] = date($format, strtotime($time_arr[$i][x]));
$time_arr[$i][end] = date($format, $e_stamp);
//}
break;
case year:
$start = date('Y-01-01 00:00:00', strtotime($startTime));
$end = date('Y-01-01 00:00:00', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
} else {
$i = 1;
$time_arr[0][x] = date('Y', $s_stamp);
$time_arr[0][start] = date($format, $s_stamp);
$s_stamp = strtotime(date("Y-12-31 23:59:59", $s_stamp));
$time_arr[0][end] = date($format, $s_stamp);
$nu = 0;
for ($j = 01; $j <= 12; $j++) {
$stamp = strtotime(date("Y-$j", $s_stamp));
$nu += date("t", $stamp);
}
$ns_stamp+=$nu * 86400;
}//$ne_stamp = $e_stamp;
while ($ns_stamp < $ne_stamp) {
$time_arr[$i][x] = date('Y', $ns_stamp);
$time_arr[$i][start] = date($format, $ns_stamp);
$n = 0;
for ($j = 01; $j <= 12; $j++) {
$stamp = strtotime(date("Y-$j", $ns_stamp));
$n += date("t", $stamp);
}
$ns_stamp+=$n * 86400 - 1;
$time_arr[$i][end] = date($format, $ns_stamp);
$ns_stamp+=1;
$i++;
}
$e_stamp-=1;
//if ($ne_stamp < $e_stamp) {
$time_arr[$i][x] = date('Y', $ne_stamp);
$time_arr[$i][start] = date($format, $ne_stamp);
$time_arr[$i][end] = date($format, $e_stamp);
//}
break;
default:
break;
}
//var_dump($time_arr);
return $time_arr;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值