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.ENGLISHyy:两位年份,默认将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
相关产品推荐
相关产品推荐

