Когда вы используете классы пакета Java.util, такие как Date, Calendar и т. д., довольно часто требуется, чтобы дата или календарь заполнялись текущей датой и временем.

В таких случаях мы можем получить это, используя ниже

Date currentDate = new Date();
Calendar currentCalendar = Calendar.getInstance();

Допустим, мы хотим напечатать эти значения. Когда мы печатаем значения на консоль, значения, которые будут выводиться на консоль, будут примерно такими.

System.out.println(currentDate);
System.out.println(currentCalendar);
------------------------------------
Output:
Tue Jun 19 20:02:38 IST 2018
Tue Jun 19 20:02:38 IST 2018

Вы можете видеть, что отображаемое выходное значение представлено в базовом часовом поясе, в котором работает приложение, т. е. в данном случае IST. Если тот же код выполняется в другом приложении, работающем в другом часовом поясе, скажем, в формате UTC, значения будут примерно такими.

Output when run on appication with UTC timezone:
Tue Jun 19 14:32:38 UTC 2018
Tue Jun 19 14:32:38 UTC 2018

Таким образом, отображаемые фактические значения зависят от базового часового пояса. Это может вызвать проблемы, когда это поле является частью объекта модели Hibernate, содержащегося в модуле, который используется совместно двумя приложениями, и оба приложения записывают в одну и ту же базу данных, а также когда приложения работает в разных часовых поясах. Мы хотели бы заполнить поле в столбце таблицы базы данных значениями даты в определенном часовом поясе. Но в этом случае, если мы генерируем объекты даты или календаря так, как мы делали ранее, это будет создать проблему, когда одно приложение генерирует дату в одном часовом поясе, а другое приложение - в другом часовом поясе, но правильный способ - хранить даты в одном согласованном часовом поясе.

Как мы можем справиться с этой проблемой? Одним из решений является использование классов пакета времени java8, таких как ZonedDateTime. Но может быть случай, когда вы не можете себе этого позволить, и вам нужно как-то справиться с объектами Calendar или Date.

В таких случаях мы можем использовать приведенное ниже, предполагая постоянный часовой пояс, который мы хотим сгенерировать в формате UTC.

Calendar currentCalendar = GregorianCalendar.from(ZonedDateTime.of(LocalDateTime.now(Clock.systemUTC()),ZoneId.systemDefault()));
Date currentDate = Date.from(LocalDateTime.now(Clock.systemUTC()).atZone(ZoneId.systemDefault()).toInstant());

Если мы используем описанный выше способ для получения текущих значений даты и времени, когда вы выводите значения на консоль, значения будут только в одном согласованном часовом поясе (в данном случае UTC).

Пожалуйста, посетите мой канал YouTube https://youtube.com/channel/UC-8tqCyhtt6Lt5-n2UMZB_A