Мы используем пользовательский тип даты Hibernate. Каждый раз, когда мы устанавливаем параметр в запросе, мы используем базовый класс или служебный метод, чтобы мы могли передать часовой пояс пользователя в параметр пользовательского типа.
Вы можете обойтись, просто вручную установив время в служебном методе для запросов, но таким образом даты, которые считываются или записываются в базу данных, также правильно конвертируются. Этот метод также обрабатывает ситуацию, когда база данных хранит дату в своем часовом поясе. Таким образом, даже если у вас есть пользователь в одном часовом поясе, сервер базы данных в другом, а Java использует GMT, все может быть просто. В конечном итоге выглядит как:
Properties properties = new Properties();
properties.setProperty("timeZone", databaseTimeZone);
query.setParameter("from", dateEnteredByUser, Hibernate.custom(LocalizedDateType.class, properties));
В качестве дополнительного бонуса мы используем это, чтобы справиться с тем фактом, что SQL Server преобразует 23: 59: 59.999 на следующий день. В пользовательском типе мы проверяем это и отменим его.