#java #sql
#java #sql
Вопрос:
Вот моя проблема: я создаю веб-приложение. Я использую RESTful services, используя java в серверной части. Эти службы размещены на сервере в Великобритании. Пользователи моего приложения в основном попадают в европейские страны. Разница во времени между двумя местоположениями создает проблему. Допустим, пользователи моего приложения находятся в Германии. Германия опережает Великобританию на 1 час. (Предполагая, что мы летом). Теперь, для поиска элементов из серверной части и отображения в пользовательском интерфейсе, у меня есть фильтр времени, который должен быть применен в серверной службе. Если мой пользователь входит в мое приложение в Германии в 9 утра по местному времени, как я могу убедиться, что серверная служба также применяет фильтр времени на основе времени Германии, а не времени Великобритании.
Вот что я пробовал до сих пор:
В моем классе репозитория (UnitRepository.java ) Я сделал это:
@Query(value="select asu.* from Site_Unit su where su.SCHEDULED_DEPARTURE_TIME between :startTime and :endTime", nativeQuery = true )
List<ResultDTO> getUnitsByTime(@Param("startTime") Timestamp startTimeFilter,
@Param("endTime") Timestamp endTimeFilter);
В моем классе DaoImpl я сделал это:
public List<ResultDTO> getUnitsByTime() {
Calendar today12Noon = new GregorianCalendar();
today12Noon.set(Calendar.HOUR_OF_DAY, 12);
today12Noon.set(Calendar.MINUTE, 0);
today12Noon.set(Calendar.SECOND, 0);
today12Noon.set(Calendar.MILLISECOND, 0);
java.util.Date endTime = today12Noon.getTime(); // end time is till 12pm of the same day
java.util.Date startTime = new java.util.Date(); // start time is the time when user logs in to the application
return unitRepository.getUnitsByTime(new Timestamp(startTime.getTime()), new Timestamp(endTime.getTime()));
}
Однако ‘startTime’ выбирает системную дату для времени Великобритании, тогда как я хочу, чтобы это было для часового пояса Германии.
Любые указания будут оценены.(Есть еще несколько фрагментов кода, которые я пропустил, поскольку здесь это не имеет значения)
Ответ №1:
Прежде всего, я ОЧЕНЬ НАСТОЯТЕЛЬНО рекомендую не использовать устаревшие классы Date
Timestamp
и переключиться на классы в java.time
пакете. Например, ZonedDateTime. Используя классы из этого пакета, вы можете легко преобразовать время в GMT в местное время. Это общее предложение. Что касается вашей проблемы, есть несколько решений:
- пользователь может отправлять вам параметры времени, которые включают в себя часовой пояс: например, они отправят вам экземпляр
ZonedDateTime
, в котором есть информация о часовом поясеLocalDateTime
, а не нет. В этом случае, если вы используетеZonedDateTime
класс в качестве фильтра в своем запросе, все будет работать автоматически. - Вы можете сохранить профиль пользователя в своем приложении, и там вы можете сохранить часовой пояс пользователя. В этом случае, даже если пользователь отправляет вам параметр запроса времени без часового пояса, вы можете настроить время на основе часового пояса пользователя, взятого из профиля пользователя