String userTimeZone = "Asia/Samarkand";
String userDate = "2018-07-05";
ZoneId zone = ZoneId.of(userTimeZone);
Instant dbInstant = LocalDate.parse(userDate)
.atStartOfDay(zone)
.toInstant();
System.out.println(dbInstant);
Это печатает то, что вы ожидали:
2018-07-04T19: 00: 00Z
Я не знаю драйвера JDBC MongoDB, но я предполагаю, что был бы рад принять Instant
и сохранить его в формате UTC в базе данных.
GMT+05:00
на самом деле не часовой пояс, это смещение по Гринвичу. Если ваш пользователь находится в часовом поясе, который всегда использует одно и то же смещение UTC, это будет работать. Но политики склонны передумать, поэтому, даже если этот часовой пояс не использует летнее время (DST), это может сработать через пару лет. И очень много часовых поясов уже делают. Поэтому ваш пользователь должен выбрать правильный часовой пояс, например Asia/Tashkent
.
Редактировать: Из вашего комментария я понимаю, что MongoDB ожидает объект java.util.Date
. Забавно и старомодно, но в этом случае преобразование будет простым, если вы знаете, как:
Date dbDate = Date.from(dbInstant);
System.out.println(dbDate);
На моем компьютере в часовом поясе Европы / Копенгагена это напечатано:
Ср. 04 июля, 21:00:00 CEST 2018
Не обманывайте себя: это правильное время. Date.toString
(неявно вызывается через System.out.println
) получает настройку часового пояса моей JVM и использует ее для генерации строки. Сам Date
не имеет часового пояса и содержит тот же момент времени, что и Instant
.
Ссылка: Обучающая программа Oracle: Дата Время