ZonedDateTime.format()返回一个String。可以将此字符串转换为Date(或任何相关的Date类)

时间:2017-10-27 06:05:24

标签: hibernate date java-8 java-time

我有一个日期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;
} 

0 个答案:

没有答案