You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向Java SpringBoot API传递日期参数并在业务方法中使用

原有代码核心问题

  • 入参类型错误:日期参数用int类型接收完全不符合实际需求,无法对应2010/01/01这类格式的入参
  • 空指针异常:声明的Date对象初始化为null,直接调用setDate方法会直接抛出NPE
  • 日期解析逻辑完全错误:Date的setDate方法仅设置当月的第几天,根本无法完成字符串转完整日期的需求
  • 耗时计算逻辑错误:用开始时间减结束时间会得到负数耗时,不符合预期
  • 查询Mongo的参数未做正确转换就传入,无法查询到正确的日期区间数据

正确实现步骤

步骤1:统一日期格式约定

首先前后端约定入参的日期格式,这里用你需求示例的yyyy/MM/dd格式对齐。

步骤2:调整接口代码实现

推荐用Java 8+的LocalDate类替代老旧的Date类,避免线程安全和API设计缺陷问题:

import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.util.List;

@CrossOrigin
@RequestMapping(value = "/sumAllHours", method = RequestMethod.GET)
public ResponseEntity<Double> calcularhorastotais(
        // 直接指定入参的日期格式,Spring会自动完成解析
        @RequestParam(value = "startDate") @DateTimeFormat(pattern = "yyyy/MM/dd") LocalDate startDate,
        @RequestParam(value = "endDate") @DateTimeFormat(pattern = "yyyy/MM/dd") LocalDate endDate) {

    // 入参合法性校验
    if (startDate.isAfter(endDate)) {
        return new ResponseEntity<>(0.0, HttpStatus.BAD_REQUEST);
    }

    // 调用Mongo查询对应日期区间的文档
    List<Documents> documents = db.getDocumentsBetweenDateCreate(startDate, endDate);

    // 累加总耗时
    double totalHours = 0.0;
    for (Documents doc : documents) {
        // 假设Documents类的startHour、endHour是当日小时数值(如8代表8点)
        // 如果是时间戳/Date类型,可自行转换为小时差再累加
        double singleHours = doc.getEndHour() - doc.getStartHour();
        // 过滤无效的负数耗时数据
        if (singleHours > 0) {
            totalHours += singleHours;
        }
    }

    return new ResponseEntity<>(totalHours, HttpStatus.OK);
}

步骤3:调整MongoDAO层查询逻辑

将原来接收int参数的查询方法改为接收LocalDate参数,Spring Data MongoDB查询示例如下:

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;

public List<Documents> getDocumentsBetweenDateCreate(LocalDate startDate, LocalDate endDate) {
    Query query = new Query();
    // 假设文档中存储的日期字段为createTime,类型为LocalDate/Date
    query.addCriteria(Criteria.where("createTime").gte(startDate).lte(endDate));
    return mongoTemplate.find(query, Documents.class);
}

补充说明

如果Mongo文档的日期字段存储的是时间戳,需要把入参的LocalDate转换为对应毫秒值再传入查询;如果单条记录跨天,不要直接用小时字段相减,用ChronoUnit.HOURS.between(开始时间, 结束时间)计算完整的小时差即可。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:18:04