java.time.format.DateTimeParseException: текст '2019-02-16 09: 29: 32.959' не может быть проанализирован, неразобранный текст найден в индексе 10 - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть столбец в MySQL с типом timestamp, который содержит «2019-2-16 8:00:00», и я использую весеннюю загрузку, чтобы получить локальную версию сегодня и сравнить с ней.Я сделал много поиска в Google, но нет никакой помощи.Вот мой окончательный код:

   @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 = "task") открытый класс Task реализует Serializable {

@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

Я много раз искал, чтобы найти, но все еще не получил подходящего ответа.Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Вы правы и более того.Хотя классы Date, Calendar и Timestamp официально еще не устарели, они давно устарели, и из-за их проблем с дизайном мы не должны использовать их, когда можем этого избежать.

Я не Spring Bootпользователь и не знает, что передать на запрос вместо старомодного Date.Я бы очень ожидал, что существует более современное решение, использующее один из современных типов из API java.time (где принадлежат OffsetDateTime, Instant и DateTimeFormatter).Если вам нужно только указать дату, а не время суток, то 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, поэтому оно не могло бы сработать.

0 голосов
/ 16 февраля 2019

Проблема с шаблоном, который вы используете.Попробуйте это: -

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

Вместо: -

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