我在MySQL中有一列类型为timestamp的列包含“ 2019-2-16 8:00:00”,并且我正在使用spring boot来获取今天的本地数据并与之进行比较。我在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处找到了未解析的文本
我做了很多搜索以找出答案,但仍然没有合适的答案。 谢谢。
答案 0 :(得分:1)
您是正确的,不仅如此。虽然Date
,Calendar
和Timestamp
类尚未正式弃用,但它们早已过时,由于它们的设计问题,在可以避免使用它们时我们不应该使用它们。
我不是Spring Boot用户,也不知道传递给查询什么,而不是老式的Date
。我非常希望使用java.time API中的一种现代类型(其中OffsetDateTime
,Instant
和DateTimeFormatter
属于其中一种)来提供更现代的解决方案。如果您只需要传递日期而不是一天中的时间,那么LocalDate
将是合乎逻辑的,但正如我所说,我不知道。
如果您必须在Spring Boot查询中使用Date
:
private static Date getToday() {
Instant instant = Instant.now();
return Date.from(instant);
}
您的代码出了什么问题?要解析为OffsetDateTime
的日期时间字符串和格式模式字符串,不仅需要指定日期,还需要指定时间和UTC偏移量(或您需要以其他方式提供它们)。在您的代码中,OffsetDateTime
成功地将2019-02-16
解析为yyyy-MM-dd
,并且由于格式模式不再更长,因此它抱怨来自Timestamp.toString
的字符串是正确的。但是,缩短字符串将无济于事,因为那会丢失一天中的时间,并且无论如何都将使用UTC偏移量,因此它不可能起作用。
答案 1 :(得分:0)
问题与您使用的模式有关。 试试这个:-
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
而不是:-
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");