如何向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
相关产品推荐
相关产品推荐

