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

Java CriteriaQuery日期比较问题:如何转换特定格式字符串为LocalDateTime?

解决Java CriteriaQuery中自定义日期格式解析与比较问题

针对你遇到的日期格式01-Jan-90 12:00:00.123456789 AM解析失败问题,核心是需要自定义匹配该格式的DateTimeFormatter,以下是具体解决方案:

1. 自定义日期格式化器

该格式包含英文月份缩写、两位年份、纳秒级精度和AM/PM标识,需指定英文Locale避免解析错误:

// 构建匹配目标格式的格式化器
DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
        .appendPattern("dd-MMM-yy hh:mm:ss.nnnnnnnnn a")
        .toFormatter(Locale.ENGLISH);

关键细节说明:

  • dd:两位日数字
  • MMM:英文月份缩写(如Jan),必须搭配Locale.ENGLISH
  • yy:两位年份,默认将69-99解析为1969-1999(90对应1990),若需自定义年份范围可追加appendValueReduced指定基准年
  • hh:mm:ss.nnnnnnnnn:12小时制时间+9位纳秒精度
  • a:AM/PM标识

2. 解析字符串为LocalDateTime

使用自定义格式化器完成字符串到LocalDateTime的转换:

String dbDateString = "01-Jan-90 12:00:00.123456789 AM";
LocalDateTime targetDateTime = LocalDateTime.parse(dbDateString, dateFormatter);

3. 在CriteriaQuery中进行日期比较

确保实体类中对应字段类型为LocalDateTime(JPA会自动映射数据库TIMESTAMP类型),然后直接在查询中使用解析后的对象:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<YourEntity> query = cb.createQuery(YourEntity.class);
Root<YourEntity> root = query.from(YourEntity.class);

// 示例:等于匹配
query.where(cb.equal(root.get("yourDateColumn"), targetDateTime));

// 其他比较示例:大于/小于
// query.where(cb.greaterThan(root.get("yourDateColumn"), targetDateTime));
// query.where(cb.lessThanOrEqualTo(root.get("yourDateColumn"), targetDateTime));

List<YourEntity> result = entityManager.createQuery(query).getResultList();

额外注意事项

  • 若实体类字段类型与数据库不匹配(如数据库是DATE类型),需调整字段类型或格式化器(改用LocalDate)
  • 若年份解析不符合预期,可通过appendValueReduced指定基准年,例如强制将两位年份映射到1900-1999:
DateTimeFormatter customYearFormatter = new DateTimeFormatterBuilder()
        .appendPattern("dd-MMM-")
        .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.of(1900, 1, 1))
        .appendPattern(" hh:mm:ss.nnnnnnnnn a")
        .toFormatter(Locale.ENGLISH);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:43:18