我有一个日期String
'日期'作为输入。我正在将此字符串转换为LocalDate
,我设置了一个时区(比如合作伙伴的时区)。这给了我ZonedDateTime
的时间。到目前为止一切都很好!
现在我在数据库中有一个Date
字段,我必须比较我的这个日期。因此,我将此ZonedDateTime
值格式化为数据库中日期的格式。我使用format()
作为相同的值,它以所需的格式返回格式化日期的String
值。
问题从此处开始。我希望此String
值(请参阅代码中的zonedDateTimeUTC
)与数据库中的Date
列进行比较使用Hibernate。如果我直接使用String
值,我会得到一个异常,说明不兼容的类型。我尝试搜索选项以将此zonedDateTimeUTC
设置为任何等效的日期对象(我认为ZonedDateTime
是最合适的)。但我不能这样做。你能指导我完成这件事。
String pattern = "yyyy-MM-dd";
if(null != date && !date.isEmpty()){
//Get ZonedDateTime in Partner's time zone
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
LocalDate localdate = LocalDate.parse(date, formatter);
ZonedDateTime zoneDateTime = localdate.atStartOfDay(ZoneId.of(timeZone));
//Getting the date in UTC format
String utcPattern = "yyyy-MM-dd hh:mm:ss.SSSSSS";
String zonedDateTimeUTC = zoneDateTime.withZoneSameInstant(ZoneId.of("+00:00")).format(DateTimeFormatter.ofPattern(utcPattern));
}
Hibernate代码使用标准API。块中的代码如下:
Session session = getSessionFromSessionFactory(getSessionFactory());
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<ImportRequest> criteriaQuery =
criteriaBuilder.createQuery(ImportRequest.class);
Root<ImportRequest> importRequestRoot = criteriaQuery.from(ImportRequest.class);
criteriaQuery.select(importRequestRoot);
List<Predicate> restrictions = new ArrayList<>();
if (transferReqSearchVO.getReceivedOnStartZonedDateTime() != null){
restrictions.add(criteriaBuilder.greaterThanOrEqualTo(
importRequestRoot.get("received"),
transferReqSearchVO.getReceivedOnStartZonedDateTime()));
}
if (null != restrictions && !restrictions.isEmpty())
criteriaQuery.where(restrictions.toArray(new Predicate[0]));
TypedQuery<ImportRequest> importRequestQuery = session.createQuery(criteriaQuery);
return importRequestQuery.getResultList();
域中收到的日期字段指定如下:
@Column(name = "RECEIVED_ON", updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date received;
public Date getReceived() {
return received;
}
public void setReceived(Date received) {
this.received = received;
}