Вступление
В этой статье мы рассмотрим множество способов получить текущую дату и время в Java . Большинство приложений нуждаются в отметках времени событий или отображении даты / времени, среди многих других вариантов использования:
- Когда мы публикуем блоги на веб-сайте, дата публикации записывается в базу данных и отображается читателю.
- Когда мы совершаем действие, мы хотели бы знать, когда оно будет доступно, чтобы мы могли отслеживать их.
- Когда мы покупаем что-то в Интернете или совершаем транзакцию, наши банки предлагают нам список транзакций с точными отметками времени, чтобы мы могли их просмотреть.
Короче говоря, получение текущей даты и времени в Java очень важно и имеет множество применений, и, к счастью, это действительно легко получить для любого использования.
System.currentTimeMillis ()
Если вы хотите получить одно числовое значение миллисекунд, прошедших с эпохи UNIX , это так же просто, как:
System.currentTimeMillis();
Распечатка этого значения приведет к примерно следующему:
1580897313933
При преобразовании этого числа обратно в удобочитаемую дату оно представляет:
Wednesday, 5 February 2020 10:08:33.933
А чтобы сделать это на Java, нам понадобится всего пара строк кода:
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
System.out.println(formatter.format(date));
Выполнение этого фрагмента кода даст:
2020-02-05 at 10:11:33 UTC
Примечание: имейте в виду, что этот метод возвращает текущее значение в зависимости от вашего системного времени.
java.util.Date
В Java получить текущую дату так же просто, как создать экземпляр Date
из пакета Java java.util
:
Date date = new Date(); // This object contains the current date value
Мы можем легко отформатировать эту дату:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
System.out.println(formatter.format(date));
И запуск этого фрагмента кода даст:
05-02-2020 10:12:46
API календаря
Среди множества классов Java есть Calendar
, который используется для
преобразования даты и времени между конкретными моментами и полями
календаря.
Получить текущую дату и время очень просто с помощью календаря:
Calendar calendar = Calendar.getInstance(); // Returns instance with current date and time set
Опять же, мы можем легко отформатировать это:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
System.out.println(formatter.format(calendar.getTime()));
Метод getTime()
возвращает объект Date
Поскольку SimpleDateFormat
работает только с Date
, мы вызываем метод getTime()
Calendar
для
его форматирования.
Выполнение этого фрагмента кода даст:
25-11-2018 00:43:39
API даты / времени
Java 8 познакомила нас с совершенно новым API, который был включен в
сборку для замены java.util.Date
и java.util.Calendar
.
По-прежнему полезно знать, как получить текущую дату и время с помощью двух предыдущих классов, поскольку не все приложения еще перешли на Java 8.
API даты / времени предоставляет несколько классов, на которые мы можем положиться при выполнении работы:
LocalDate
LocalDate
представляет собой просто дату без времени. Это означает,
что мы можем получить только текущую дату, но без времени суток:
LocalDate date = LocalDate.now(); // Gets the current date
На этот раз вместо инициализации нового объекта мы вызываем статический
метод now()
который возвращает текущую дату в соответствии с
системными часами с часовым поясом по умолчанию.
Мы можем отформатировать этот объект:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
System.out.println(date.format(formatter));
Выполнение этого фрагмента кода даст:
05-02-2020
Вы также можете передать ZoneId
методу для получения даты на основе
указанного часового пояса, а не по умолчанию:
LocalDate date = LocalDate.now(ZoneId.of("Europe/Paris")); // Gets current date in Paris
Вы можете получить список всех доступных идентификаторов часовых поясов через:
System.out.println(ZoneId.getAvailableZoneIds());
Местное время
LocalTime
является противоположностью LocalDate
, поскольку
представляет только время без даты. Это означает, что мы можем получить
только текущее время дня без фактической даты:
LocalTime time = LocalTime.now(); // Gets the current time
Мы можем легко отформатировать этот объект:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(time.format(formatter));
Выполнение этого фрагмента кода даст:
00:55:58
LocalDateTime
И, наконец, LocalDateTime
, наиболее часто используемый класс Date /
Time в Java, представляет собой комбинацию двух предыдущих - хранит
значение как даты, так и времени:
LocalDateTime dateTime = LocalDateTime.now(); // Gets the current date and time
Мы можем легко отформатировать этот объект:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(dateTime.format(formatter));
Выполнение этого фрагмента кода даст:
05-02-2020 10:31:42
ZonedDateTime
Наряду с предыдущими классами ZonedDateTime
также предлагает эту
функциональность:
ZonedDateTime dateTime = ZonedDateTime.now(); // Gets the current date and time, with your default time-zone
Мы можем легко отформатировать этот объект:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(dateTime.format(formatter));
Выполнение этого фрагмента кода даст:
05-02-2020 10:32:26
Часы
Другой класс, представленный нам в Java 8 Date / Time API, - это класс
Clock
Он обеспечивает доступ к текущему Instant
, LocalDate
,
LocalTime
и LocalDateTime
с использованием часового пояса.
При этом, используя Clock
, вы практически создаете экземпляры всех из
них и можете получить доступ к тем, которые вам интересны.
// Clock with the system's default timezone
Clock clock = Clock.systemDefaultZone();
// Clock with the UTC timezone
Clock clock = Clock.systemUTC();
С помощью этого экземпляра объекта мы можем создать экземпляры многих из ранее упомянутых классов:
// Each of these obtain the current instance of that class from the clock
LocalDateTime localDateTime = LocalDateTime.now(clock);
LocalTime localTime = LocalTime.now(clock);
LocalDate localDate = LocalDate.now(clock);
Instant instant = Instant.now(clock);
ZonedDateTime zonedDateTime.now(clock);
Примечание: уместно спросить, почему мы использовали Clock
вместо
того, чтобы просто оставить метод now()
пустым. Clock
является
обязательным, и метод now()
обычно использует системные часы для
определения значений. Хотя с помощью часов вы можете иметь больше, чем
просто часы вашей системы, если хотите. Однако в нашем примере это не
имеет значения.
Используя clock
, мы можем извлечь Instant
:
Instant instant = clock.instant();
System.out.println(instant);
Выполнение этого кода даст:
2020-04-16T17:05:43.867063Z
Вы можете создать зонированные Clock
, передав ZoneId
в
Clock.system()
:
Clock clock = Clock.system(ZoneId.of("Europe/Paris"));
Печать значения Instant
принадлежащего clock
, даст:
2020-04-16T17:08:16.139183Z
И, наконец, используя Clock
помощью millis()
, вы можете получить
доступ к миллисекундному значению часов, которое совпадает с
System.currentTimeMillis()
:
System.out.println(clock.millis());
System.out.println(System.currentTimeMillis());
Оба они распечатают:
1587057153329
1587057153329
Джода-Тайм
Joda-Time - это инструмент, который изначально был разработан для решения проблем со старыми классами времени и даты Java.
С выпуском Java 8 эти проблемы были решены, и Joda-Time выполнила свою задачу, хотя сегодня не используется очень часто.
Опять же, если ваш проект не обновлен до Java 8, Joda-Time по-прежнему является отличным инструментом для использования в качестве альтернативы.
Чтобы использовать его в своем проекте, проще всего просто добавить зависимость Maven:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${version}</version>
</dependency>
Работа с Joda-Time очень похожа на работу с Java Date / Time API:
DateTime dateTime = new DateTime(); // Initializes with the current date and time
Примечание. При первой инициализации DateTime
Joda-Time возникают
известные проблемы с производительностью из-за загрузки дескрипторов
хронологии
.
Этот объект легко отформатировать:
DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(fmt.print(dateTime));
Выполнение этого фрагмента кода даст:
05-02-2020 10:33:05
Заключение
Во многих случаях кому-то может понадобиться получить текущую дату и /
или время в Java, и мы рассмотрели все подходы, которые существуют на
данный момент для этого, включая более старые классы - java.util.Date
и java.util.Calendar
а также новые java.time
которые появились с
новым API даты / времени.
Кроме того, мы рассмотрели Joda-Time и его подход к получению текущей даты и времени.
Если вы хотите прочитать о преобразовании строки в дату в Java , у нас это есть!