开始时间结束时间参数不能为空,时间间隔不能超过90天

本文介绍了一种用于验证前端传入的时间参数是否超出90天间隔的方法。通过Controller层调用业务逻辑层的方法,利用DateUtil工具类计算两个时间点之间的天数差,确保其不超过90天。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Controller层

 public AjaxResult export(@RequestBody IncomingAccountQuery incomingAccountQuery)
    {
        //判断时间是否大于90天
        HashMap<String, Object> timeMap = new HashMap<>();
        @NotBlank String        beginTime = incomingAccountQuery.getStartTime();
        @NotBlank String        endTime = incomingAccountQuery.getEndTime();
        timeMap.put("beginTime",beginTime);
        timeMap.put("endTime",endTime);
        boolean isValid = businessDaytransDataService.isValidSearchTimeNinety(timeMap, false);
        if (!isValid)
        {
            return AjaxResult.error("开始时间结束时间参数不能为空,时间间隔不能超过90天!");
        }
}

可以看到 ,开始时间和结束时间是前端传递的,我们拿到这两个参数,放进map里,调用了一个

isValidSearchTimeNinety(timeMap, false)的方法,我们来看看这个方法里做了什么

接口

 /**
     * 判断搜索时间 是否有效 前后时间间隔不超过90天
     * @param map
     * @return
     */
    boolean isValidSearchTimeNinety(Map<String, Object> map,boolean isNeedAddOneEndDay);

实现类

@Override
    public boolean isValidSearchTimeNinety(Map<String, Object> map, boolean isNeedAddOneEndDay)
    {
        Object beginTime = map.get("beginTime");
        Object endTime   = map.get("endTime");

        if (beginTime == null || endTime == null)
        {
            return false;
        }

        String beginTimeStr = beginTime.toString();
        String endTimeStr   = endTime.toString();

        if (beginTimeStr.isEmpty() || endTimeStr.isEmpty())
        {
            return false;
        }
        long days = DateUtil.between(DateUtil.parseDate(beginTimeStr), DateUtil.parseDate(endTimeStr), DateUnit.DAY);
        if (days > 90)
        {
            return false;
        }
        map.put("initEndTime", endTime.toString());
        //判断结束日期是否需要加一天 存在页面上查询带时分秒格式的日期 传入同一天 结束日期需要加一天的情况
        if (isNeedAddOneEndDay)
        {
            DateTime d = DateUtil.offsetDay(DateUtil.parseDate(endTimeStr), 1);
            map.replace("endTime", d.toDateStr());
        }
        return true;
    }

可以看到,实现类里这段代码,实现了对传入时间是否大于90天做了一个校验

long days = DateUtil.between(DateUtil.parseDate(beginTimeStr), DateUtil.parseDate(endTimeStr), DateUnit.DAY);
        if (days > 90)
        {
            return false;
        }

那么如果你有这种对时间参数规定对大的一个需求。完全可以拿我的接口 和实现类,进行修改!!

<think>嗯,用户问的是如何在Python中实现时间滑动窗口算法,还希望有示例代码和解释。首先,我需要回忆一下滑动窗口的基本概念。滑动窗口通常用于处理数组或序列数据,通过固定或可变大小的窗口在数据上滑动,进行各种操作,比如统计、计算最大值、平均值等。时间滑动窗口可能涉及时间序列数据,比如按时间排序的数据点,窗口基于时间间隔而不是固定元素数量。 用户提到的引用中有几个相关的例子,比如引用[4]提到用于处理测试数据的时序维度问题,用滑动窗口生成32维度的窗口。这可能类似于将长时间序列分割成多个固定长度的时间窗口。所以,时间滑动窗口可能需要考虑时间戳,确保每个窗口的时间间隔符合要求,比如每个窗口覆盖固定的时间长度,比如一小时、一等。 接下来,我需要考虑如何用Python实现这个。可能需要遍历时间序列数据,每次移动窗口时,根据时间范围选择数据点。例如,给定一个时间序列列表,每个元素包含时间戳和值,窗口每次滑动一个步长,比如1小时,窗口覆盖24小时的数据,那么每次移动窗口时,移除旧的数据点,加入新的数据点,保持窗口内数据的时间范围不超过24小时。 另外,引用中的示例代码可能可以参考。比如,引用[2]中的最大和滑动窗口,使用双指针或队列来维护窗口中的元素。不过时间滑动窗口可能需要基于时间戳来维护窗口,而不仅仅是元素数量。 可能的实现步骤: 1. 将数据按时间排序,确保时间序列是按时间升序排列的。 2. 初始化两个指针,比如左指针和右指针,初始都指向0。 3. 右指针向右移动,直到窗口内的时间范围不超过设定的窗口大小(比如24小时)。 4. 处理当前窗口的数据(如计算平均值、最大值等)。 5. 移动左指针,直到窗口内的数据再次符合时间范围,然后重复步骤3-5,直到处理完所有数据。 在代码实现时,需要注意时间的高效处理,比如使用datetime模块处理时间戳,计算时间差。可能还需要考虑大数据量下的性能问题,比如使用双指针来避免重复计算。 现在,需要写一个具体的例子。假设有一个时间序列数据,每个数据点包含时间戳和值,窗口大小为24小时,每次滑动步长为1小时。那么代码需要遍历每个可能的窗口,收集窗口内的数据,并进行处理。 可能的代码结构: - 输入数据:一个列表,元素为元组(timestamp, value),已按时间排序。 - 初始化左=0,右=0。 - 遍历右指针,直到所有数据被处理。 - 对于每个右指针的位置,检查当前时间与左指针的时间差是否超过窗口大小。如果超过,移动左指针直到时间差在窗口范围内。 - 收集窗口内的数据,进行需要的计算。 例如,假设窗口是24小时,那么对于每个右指针的位置,窗口内的数据的时间戳必须大于等于当前右指针时间 - 24小时。此时,左指针需要调整到第一个满足该条件的位置。 测试数据可能需要生成一些带有时间戳的数据,比如按小时递增的时间戳,然后测试滑动窗口是否能正确分割数据。 此外,用户的问题中提到的引用[4]提到时序网络模型,输入是32的时间步,而测试数据是90步,所以需要滑动窗口生成多个32长度的窗口。这种情况下,可能窗口是固定长度的,比如32个时间步,滑动步长可能是一个步长。这种情况下,时间窗口可能按固定步数滑动,而不是按时间间隔。这时候需要考虑是时间间隔还是固定步数的滑动。 不过用户的问题是关于时间滑动窗口,可能更关注基于时间间隔的窗口。但需要根据具体情况而定。可能两种情况都需要考虑,但用户的问题更偏向于时间间隔。 综合以上思考,我需要提供一个基于时间间隔的滑动窗口的Python实现示例,并解释代码逻辑。可能需要使用datetime模块来处理时间,双指针来维护窗口的左右边界,以及示例数据和测试用例。</think>### 时间滑动窗口算法Python实现详解 时间滑动窗口常用于处理时序数据,例如传感器数据、金融交易记录等。其核心是**按时间范围动态截取数据子集**,例如统计“最近24小时内用户登录次数”或“每小时平均温度”。以下是分步实现方法及示例: --- #### **步骤1:定义时间窗口参数** ```python from datetime import datetime, timedelta # 示例数据:时间戳和数值组成的时序数据(已按时间排序) data = [ (datetime(2023, 10, 1, 9, 0), 15), (datetime(2023, 10, 1, 10, 30), 20), (datetime(2023, 10, 1, 12, 0), 18), (datetime(2023, 10, 1, 14, 45), 22), # ...更多数据 ] window_size = timedelta(hours=24) # 定义24小时滑动窗口 step = timedelta(hours=1) # 窗口滑动步长为1小时 ``` --- #### **步骤2:双指针实现滑动逻辑** 使用左右指针动态控制窗口范围: ```python def time_sliding_window(data, window_size, step): left = 0 results = [] current_start = data[0][0] # 初始窗口起始时间 while current_start <= data[-1][0]: current_end = current_start + window_size window_data = [] # 移动右指针找到窗口结束边界 while left < len(data) and data[left][0] < current_start: left += 1 right = left while right < len(data) and data[right][0] <= current_end: window_data.append(data[right][1]) right += 1 # 计算窗口内数据的统计值(例如平均值) if window_data: avg = sum(window_data) / len(window_data) results.append((current_start, avg)) # 滑动窗口到下一个位置 current_start += step return results ``` --- #### **步骤3:调用与输出** ```python results = time_sliding_window(data, window_size, step) for timestamp, avg in results: print(f"窗口起始时间: {timestamp.strftime('%Y-%m-%d %H:%M')}, 平均值: {avg:.2f}") ``` --- #### **关键逻辑说明** 1. **双指针维护窗口**:左指针`left`跳过早于当前窗口的数据,右指针`right`收集窗口内数据[^3]。 2. **时间范围控制**:通过`current_start`和`current_end`动态划定窗口边界,确保时间间隔准确。 3. **步长滑动**:每次滑动后,窗口起始时间增加`step`,模拟实际时间推移。 --- #### **优化方向** 1. **预排序检查**:若数据未按时间排序,需先执行`data.sort(key=lambda x: x[0])`。 2. **高效查询**:大数据量时可将时间戳转换为数值(如Unix时间戳),用二分查找加速指针移动[^2]。 3. **重叠窗口处理**:通过调整`step`控制窗口重叠比例,例如`step=30分钟`实现50%重叠。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值