【问题标题】:java.time.format.DateTimeParseException: Text '2019-02-16 09:29:32.959' could not be parsed, unparsed text found at index 10java.time.format.DateTimeParseException:无法解析文本“2019-02-16 09:29:32.959”,在索引 10 处找到未解析的文本
【发布时间】:2019-07-10 04:36:24
【问题描述】:

我在 MySQL 中有一个类型为 timestamp 的列,其中包含“2019-2-16 8:00:00”,我今天正在使用 spring boot 获取本地并与之进行比较。我在谷歌上做了很多搜索,但没有任何帮助。这是我的最终代码:

   @Override
public 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

@Table(name = "任务") 公共类任务实现可序列化{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "title")
private String title;

@Column(name = "assigner_employee_id")
private int assignerId;

@Column(name = "assignee_employee_id")
private int assigneeId;

@Column(name = "workplace_id")
private int workplaceId;

@Column(name = "schedule_id")
private Long scheduleId;

@Column(name = "start_time")
private Timestamp startTime;

@Column(name = "end_time")
private Timestamp endTime;

@Column(name = "check_in_time")
private Timestamp checkInTime;

@Column(name = "attendance_status")
private Integer attendanceStatus;

@Column(name = "status")
private Integer status;

@Column(name = "date_create")
private Timestamp dateCreate;

@Column(name = "priority")
private Integer priority;

@Column(name = "description")
private String description;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public void setAssignerId(int assignerId) {
    this.assignerId = assignerId;
}

public void setAssigneeId(int assigneeId) {
    this.assigneeId = assigneeId;
}

public int getAssignerId() {
    return assignerId;
}

public int getAssigneeId() {
    return assigneeId;
}

public int getWorkplaceId() {
    return workplaceId;
}

public void setWorkplaceId(int workplaceId) {
    this.workplaceId = workplaceId;
}

public Long getScheduleId() {
    return scheduleId;
}

public void setScheduleId(Long scheduleId) {
    this.scheduleId = scheduleId;
}

public Integer getAttendanceStatus() {
    return attendanceStatus;
}

public void setAttendanceStatus(Integer attendanceStatus) {
    this.attendanceStatus = attendanceStatus;
}

public Integer getStatus() {
    return status;
}

public void setStatus(Integer status) {
    this.status = status;
}

public Integer getPriority() {
    return priority;
}

public void setPriority(Integer priority) {
    this.priority = priority;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public Timestamp getStartTime() {
    return startTime;
}

public void setStartTime(Timestamp startTime) {
    this.startTime = startTime;
}

public Timestamp getEndTime() {
    return endTime;
}

public void setEndTime(Timestamp endTime) {
    this.endTime = endTime;
}

public Timestamp getCheckInTime() {
    return checkInTime;
}

public void setCheckInTime(Timestamp checkInTime) {
    this.checkInTime = checkInTime;
}

public Timestamp getDateCreate() {
    return dateCreate;
}

public void setDateCreate(Timestamp dateCreate) {
    this.dateCreate = dateCreate;
}

}

我收到一个错误:

java.time.format.DateTimeParseException:无法解析文本“2019-02-16 09:29:32.959”,在索引 10 处找到未解析的文本

我做了很多搜索以找出答案,但仍然没有合适的答案。 谢谢。

【问题讨论】:

    标签: java spring-boot datetime timestamp


    【解决方案1】:

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

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

    如果您需要 Date 来进行 Spring 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 偏移量,所以它无法工作。

    【讨论】:

    • 没有更多错误,但是如何将它与 mysql 中的时间戳(仅日期部分)进行比较
    • select 标记中的 select 语句对我来说很合适,但我使用 MySQL 的经验是 10 年前的事了,所以我可能对此无能为力。
    【解决方案2】:

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

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

    而不是:-

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

    【讨论】:

    • 我试过并得到了java.time.format.DateTimeParseException: Text '2019-02-16 07:09:53.094' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {},ISO resolved to 2019-02-16T07:09:53.094 of type java.time.format.Parsed。我们更进一步,但还没有。
    猜你喜欢
    • 2020-02-16
    • 2021-06-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多