时间查询String格式支持说明.md 4.45 KB

时间查询@JsonFormat注解支持说明

功能概述

后端用户查询接口使用 @JsonFormat 注解统一处理时间格式,简化了时间参数的处理逻辑,确保时间格式的一致性。

修改内容

1. DTO类修改

文件: UserQueryReq.java

修改前:

private LocalDateTime startTime;
private LocalDateTime endTime;

修改后:

/**
 * 开始时间(创建时间范围查询)
 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDateTime startTime;

/**
 * 结束时间(创建时间范围查询)
 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDateTime endTime;

2. 查询条件构建简化

文件: SysUserServiceImpl.java

修改前:

// 开始时间:创建时间 >= 开始时间
if (StringUtils.isNotEmpty(queryReq.getStartTime())) {
    LocalDateTime startTime = parseDateTime(queryReq.getStartTime());
    if (startTime != null) {
        wrapper.ge(SysUser::getCreateTime, startTime);
    }
}

修改后:

// 开始时间:创建时间 >= 开始时间
if (queryReq.getStartTime() != null) {
    wrapper.ge(SysUser::getCreateTime, queryReq.getStartTime());
}

支持的时间格式

1. 标准格式

  • 2025-09-23 - 日期格式(推荐)
  • 时区:GMT+8(中国标准时间)

2. @JsonFormat注解优势

  • 自动格式验证
  • 时区自动转换
  • 代码简洁
  • 性能优化

功能特点

1. 自动格式处理

  • Jackson自动处理时间格式转换
  • 统一的时区处理(GMT+8)
  • 无需手动解析时间字符串

2. 代码简化

  • 移除了复杂的时间解析逻辑
  • 减少了代码维护成本
  • 提高了代码可读性

3. 性能优化

  • 利用Jackson的高效序列化/反序列化
  • 减少自定义解析逻辑
  • 更好的内存管理

使用示例

1. API调用示例

# 标准日期格式(推荐)
curl -X GET "http://localhost:8083/api/system/user/list?startTime=2025-09-23&endTime=2025-09-24"

2. 前端时间选择器

// 前端生成的时间格式(yyyy-MM-dd)
const startTime = "2025-09-23"
const endTime = "2025-09-24"

// API调用
const params = {
  startTime: startTime,
  endTime: endTime,
  pageNum: 1,
  pageSize: 10
}

3. 数据库查询

-- 实际执行的SQL查询
SELECT * FROM t_sys_user 
WHERE del_flag = '0' 
AND create_time >= '2025-09-23 00:00:00' 
AND create_time <= '2025-09-23 23:59:59'
ORDER BY create_time DESC;

错误处理

1. 格式错误处理

// 解析失败时的处理
if (startTime == null) {
    // 记录日志但不中断查询
    System.err.println("时间格式解析失败: " + queryReq.getStartTime());
    // 跳过该查询条件
}

2. 空值处理

// 空值检查
if (StringUtils.isNotEmpty(queryReq.getStartTime())) {
    // 只有非空时才进行解析
}

3. 时区处理

// 时区信息移除
if (dateTimeStr.endsWith("Z") || dateTimeStr.contains("+") || dateTimeStr.contains("-")) {
    String localTimeStr = dateTimeStr.replaceAll("[+-]\\d{2}:\\d{2}$", "").replace("Z", "");
    return LocalDateTime.parse(localTimeStr, formatter);
}

性能考虑

1. 格式化器缓存

  • 使用静态格式化器数组
  • 避免重复创建格式化器对象
  • 按使用频率排序

2. 解析优化

  • 按常用格式优先尝试
  • 快速失败机制
  • 避免不必要的字符串操作

3. 内存管理

  • 及时释放临时对象
  • 避免字符串拼接
  • 使用高效的字符串操作

测试建议

1. 格式测试

// 测试各种时间格式
String[] testFormats = {
    "2025-09-23T10:06:13.293Z",
    "2025-09-23T10:06:13",
    "2025-09-23",
    "2025-09-23 10:06:13",
    "2025/09/23"
};

for (String format : testFormats) {
    LocalDateTime result = parseDateTime(format);
    System.out.println(format + " -> " + result);
}

2. 边界测试

  • 测试极端时间值
  • 测试格式错误的时间
  • 测试空值和null值

3. 性能测试

  • 测试大量时间解析的性能
  • 测试并发解析的安全性
  • 测试内存使用情况

注意事项

  1. 时区一致性: 确保前后端时区设置一致
  2. 格式验证: 前端应验证时间格式的正确性
  3. 性能监控: 监控时间解析的性能影响
  4. 日志记录: 记录解析失败的情况便于调试

相关文件

  • UserQueryReq.java - 查询请求DTO
  • SysUserServiceImpl.java - 服务实现类
  • API接口文档.md - API文档更新