При сохранении поля LocalDate
(например, "2017-09-27") в столбце mySQL Date
с использованием API JPA CriteriaBuilder результат будет другим (например, "2017-09-26").
Я подтвердил, что часовой пояс моей базы данных установлен на UTC с использованием SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
в результате "00: 00: 00".
Я тестирую это локально, и у меня есть часовой пояс GMT + 2, поэтому я подозреваю, что когда происходит преобразование из LocalDate
в Date
, вычитается 2 часа и производится дата за 1 день до запрошенной даты (при условии, что LocalDate
поле, в результате которого отсутствует информация о времени, обрабатывается как 00:00:00.
Каков наилучший способ сохранить LocalDates в этой ситуации? Должен ли я следовать совету здесь qaru.site/info/133886/... и явно устанавливать все поля LocalDate в UTC или что-то подобное?
Я запустил тест, чтобы увидеть, что происходит при преобразовании их в код, и получил следующий результат:
Date convertedDate = Date.valueOf(localDate);
РЕДАКТИРОВАТЬ
Вот пример кода, который я использую для извлечения данных, где также происходит нечетное изменение даты. Если я запрашиваю данные за 2017-06-27
, я получаю результаты за 2017-06-26
.
CriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(HorseAndTrailerRequest.class);
Root<HorseAndTrailerRequest> criteria = criteriaQuery.from(HorseAndTrailerRequest.class);
ParameterExpression<LocalDate> effectiveDateParameter = criteriaBuilder.parameter(LocalDate.class);
criteriaQuery.select(criteria)
.where(
criteriaBuilder.equal(criteria.get("effectiveDate"), effectiveDateParameter)
);
TypedQuery<HorseAndTrailerRequest> query = sessionFactory.getCurrentSession().createQuery(criteriaQuery);
query.setParameter(effectiveDateParameter, date);
return query.getResultList();