Как получить время от пользователя относительно часового пояса - PullRequest
0 голосов
/ 27 апреля 2018

Добрый день,

Я работаю над отчетом по проекту.

и это мой первый раз, когда я имею дело с datetime.

У меня есть база данных mongodb, так как мы знаем, что mongodb хранит дату и время в UTC.

Теперь я хотел бы показать данные от пользователей при условии даты и часового пояса.

например, если я вхожу в свою систему, я могу установить свой часовой пояс из выпадающего списка. скажем, я выбираю GMT + 05: 00 сейчас, если я выбираю дату начала и окончания как 2018-07-05 и 2018-07-06

как я могу получить точное время с указанным пользователем часовым поясом.

Я полагаю, если пользователь выбрал часовой пояс GMT + 05: 00, тогда дата должна начинаться с 2018-07-04 19:00:00 и 2018-07-05 19:00:00 минус 5 часов с указанного времени .

Как я могу добиться этого, Java.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018
    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: Дата Время

0 голосов
/ 27 апреля 2018

Если у вас уже есть выбранный пользователем часовой пояс, вам нужно разобрать дату с DB на GMT:

Date dateFromDb = getDateFromDb(); // date from db
LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.of("GMT")); // parsing date to GMT but using LocalDateTime
Date correctDate = Date.from(localDateTime); // transforming into java.util.Date
...