为了账号安全,请及时绑定邮箱和手机立即绑定

java.time.format.DateTimeParseException:无法解析文本

java.time.format.DateTimeParseException:无法解析文本

森栏 2022-06-23 09:35:23
我在 MySQL 中有一个类型为 timestamp 的列包含“2019-2-16 8:00:00”,我正在使用 Spring Boot 今天获取本地并与之进行比较。我在谷歌上做了很多搜索,但没有任何帮助。这是我的最终代码:   @Overridepublic List<TaskDTO> getTodayTask(int employeeID) {    Date today = getToday();    List<Task> listOfTask = taskRepository.findByAssigneeIdAndAndStartTime(employeeID, today);    List<TaskDTO> listOfDTO = new ArrayList<>();    for (Task t : listOfTask) {        listOfDTO.add(taskMapper.toDTO(t));    }    return listOfDTO;}private Date getToday() {    Calendar calendar = Calendar.getInstance();    Timestamp timestamp = new Timestamp(calendar.getTime().getTime());    DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");    OffsetDateTime odt = OffsetDateTime.parse ( timestamp.toString() , format );    Instant instant = odt.toInstant();    return Date.from(instant);}和我的存储库:    @Query("SELECT i FROM Task i WHERE i.assigneeId = ?1 and CAST( i.startTime as date) = ?2")List<Task> findByAssigneeIdAndAndStartTime(int assigneeID, Date startTime);我发现 java.util.Date 已被弃用,所以我试图找到另一种方法。我的实体:@Entity我收到一个错误:java.time.format.DateTimeParseException:无法解析文本“2019-02-16 09:29:32.959”,在索引 10 处找到未解析的文本我做了很多搜索以找出答案,但仍然没有合适的答案。谢谢你。
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

你是对的,而且不止于此。虽然尚未正式弃用,但类和早已过时Date,并且由于它们的设计问题,我们不应该在可以避免的情况下使用它们。CalendarTimestamp


我不是 Spring Boot 用户,也不知道将什么传递给查询而不是老式的Date. 我非常希望使用 java.time API 中的一种现代类型(其中和OffsetDateTime所属)存在更现代的解决方案。如果您只需要传递一个日期,而不是一天中的时间,那么 a将是合乎逻辑的,但正如我所说,我不知道。InstantDateTimeFormatterLocalDate


如果您不可避免地需要DateSpring Boot 查询:


private static Date getToday() {

    Instant instant = Instant.now();

    return Date.from(instant);

}

你的代码出了什么问题?要解析为OffsetDateTime您的日期时间字符串和格式模式字符串,不仅需要指定日期,还需要指定时间和 UTC 偏移量(或者您需要以其他方式提供它们)。在您的代码中,OffsetDateTime成功解析2019-02-16为yyyy-MM-dd,并且由于格式模式不再,它抱怨来自的字符串Timestamp.toString是。但是,缩短字符串不会有帮助,因为这样会丢失一天中的时间,并且无论如何都会丢失 UTC 偏移量,因此它无法正常工作。


查看完整回答
反对 回复 2022-06-23
?
温温酱

TA贡献1752条经验 获得超4个赞

问题在于您使用的模式。尝试这个:-

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

代替:-

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 579 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信