如何由给定时间获取时间所在的区间

问题描述对不起大家,整天加班我说清楚下需求,前端传给我的是一个unix时间戳,我需要由时间戳,得到这个时间戳所在的时间区间,因为我要处理这个参数作为时间间隔,用来搜索日志,因为日志那里的前端时间间隔是5分钟一个间隔,比如2019-4-13 12:00 - 2019-4-13 12:05,2019-4-13 11:10 - 2019-4-13 11:15这样的时间间隔的下拉框,所以前端请求这个接口也需要这样格式的时间,我负责后端处理这个搜索参数,因此需要把前端的时间转换为该时间在哪个时间间隔内,问题已经解决,谢谢大家

问题出现的环境背景及自己尝试过哪些方法

相关代码

这是我的代码

<?php
function parse_time_range($time)
{
    $date = date('Y-m-d', $time);
    $start_hour = date('H', $time);
    $end_hour = date('H', $time);
    $minute = date('i', $time);
    $second = date('s', $time);
    $start_min = $minute;
    $end_min = $minute;
    if ($minute % 5 == 0) {
        $start_min = $minute - 5;
        $end_min = $minute + 5;
        if ($start_min <= 0) {
            $start_min = 55;
            $start_hour--;
        }
        if ($end_min >= 60) {
            $end_hour++;
            $end_min = 0;
        }
    } else {
        while ($start_min % 5 != 0) {
            $start_min--;
            if ($start_min <= 0) {
                $start_min = 55;
                $start_hour--;
                break;
            }
        }
        while ($end_min % 5 != 0) {
            $end_min++;
            if ($end_min >= 60) {
                $end_hour++;
                $end_min = 0;
                break;
            }
        }
    }
    $time_range['start'] = sprintf('%s %02d:%02d:%02d', $date, $start_hour, $start_min, 0);
    $time_range['end'] = sprintf('%s %02d:%02d:%02d', $date, $end_hour, $end_min, 0);
    return $time_range;
}
$strtime = '2019-12-09 12:00:59';
$time = strtotime($strtime);
$result = parse_time_range($time);
print_r($result);

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 4.2k
5 个回答

快速实现依赖于 Carbon 包,foreach 中可以优化,换成 二分查找法

  • 利用 php 弱类型比对的特点 简化了代码。
  • 处理了 55 ~ 00 区间计算不正确的问题
/**
 * @param static $time
 * @param        $interval
 * @return array
 * @throws \InvalidArgumentException
 */
private function getTimeRange($time, $interval = '5 minutes')
{
    $time = Carbon::parse($time);
    $time_origin = clone $time;
    $interval = CarbonInterval::createFromDateString($interval);
    $period = CarbonPeriod::start($time->startOfHour())
        ->setDateInterval($interval)
        ->setEndDate($time->endOfHour()
            ->add($interval));
    $result = $time_origin;
    foreach ($period->toArray() as $item) {
        if ($item > $time_origin) {
            $result = $item;
            break;
        }
    }
    return [
        $result->sub($interval)
            ->toDateTimeString(),
        $result->add($interval)
            ->toDateTimeString()
    ];
}

// call
getTimeRange('2019-04-09 09:49:08', '5 minutes')
// echo
array (size=2)
  0 => string '2019-04-09 09:45:00' (length=19)
  1 => string '2019-04-09 09:50:00' (length=19)
$time      = '2019-04-08 20:12:59';
$timestamp = strtotime($time);
$minute    = date('i', $timestamp);

$startMinute = floor($minute / 5) * 5;
$endMinute = $startMinute + 5;
$start     = date('Y-m-d H:' . $startMinute . ':00', $timestamp);
$start     = date('Y-m-d H:i:s', strtotime($start));

if($endMinute == 60)
{
    $endMinute = 0;
    $timestamp += 3600;
}
$end = date('Y-m-d H:' . $endMinute . ':00', $timestamp);
$end = date('Y-m-d H:i:s', strtotime($end));
var_dump($start, $end);

问题都说不明白,这是要给回答者自由发挥的空间吗?

我给你个建议。
首先假定你说的5分钟是从每天00:00:00开始的。
ok,你拿到一个时间2019-04-08 20:12:45,你只要拿到分钟数12,你就可以简单的知道他是属于10~15这个区间的,而年月日时都是不会变的,秒可以忽略。

写完回去看答案,发现@上官元恒已经给你答案了。

问题都说不明白? 拿到时间了,只要知道起始时间 判断是第几个五分钟吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题