Перейти к основному содержимому

Преобразовать java.util.Date в строку

· 4 мин. чтения

1. Обзор

В этом руководстве мы покажем, как мы можем преобразовать объекты Date в объекты String в Java . Для этого мы будем работать со старым типом java.util.Date , а также с новым API Date/Time , представленным в Java 8.

Если вы хотите узнать, как выполнить обратное преобразование, т. е. из типов String в Date , вы можете ознакомиться с этим учебным пособием здесь .

Дополнительные сведения о новом API даты/времени см. в соответствующем руководстве .

2. Преобразование java.util.Date в строку

Хотя мы не должны использовать java.util.Date , если мы работаем с Java 8, иногда у нас нет выбора (например, мы получаем объект Date из библиотеки, которая не находится под нашим контролем).

В таких случаях у нас есть несколько способов преобразовать java.util.Date в String .

2.1. Подготовка объекта даты

Давайте сначала объявим ожидаемое строковое представление нашей даты и определим шаблон желаемого формата даты:

private static final String EXPECTED_STRING_DATE = "Aug 1, 2018 12:00 PM";
private static final String DATE_FORMAT = "MMM d, yyyy HH:mm a";

Теперь нам нужен фактический объект Date , который мы хотели бы преобразовать. Мы будем использовать экземпляр Calendar для его создания:

TimeZone.setDefault(TimeZone.getTimeZone("CET"));
Calendar calendar = Calendar.getInstance();
calendar.set(2018, Calendar.AUGUST, 1, 12, 0);
Date date = calendar.getTime();

Мы установили часовой пояс по умолчанию на CET , чтобы предотвратить проблемы при дальнейшей работе с новым API. Следует отметить, что сама Date не имеет часового пояса, но ее toString() использует текущий часовой пояс по умолчанию .

Мы будем использовать этот экземпляр Date во всех наших примерах ниже.

2.2. Использование класса SimpleDateFormat

В этом примере мы будем использовать метод format() класса SimpleDateFormat . Давайте создадим его экземпляр, используя наш формат даты:

DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);

После этого мы можем отформатировать нашу дату и сравнить ее с ожидаемым результатом:

String formattedDate = formatter.format(date);

assertEquals(EXPECTED_STRING_DATE, formattedDate);

2.3. Использование абстрактного класса DateFormat

Как мы могли видеть, SimpleDateFormat является подклассом абстрактного класса DateFormat . Этот класс предоставляет различные методы для форматирования даты и времени.

Мы будем использовать его для достижения того же результата, что и выше:

String formattedDate = DateFormat
.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT)
.format(date);

При таком подходе мы передаем шаблоны стиля — СРЕДНИЙ для даты и КРАТКИЙ для времени в нашем случае.

3. Использование класса Formatter

Другой простой способ получить ту же строку , что и в предыдущих примерах, — использовать класс Formatter .

Хотя это может быть не самое читаемое решение, это поточно-ориентированный однострочный код, который может быть полезен, особенно в многопоточной среде (следует помнить, что SimpleDateFormat не является поточно-ориентированным):

String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);

Мы использовали 1$ , чтобы указать, что мы будем передавать только один аргумент для использования с каждым флагом. Подробное объяснение флагов можно найти в части преобразования даты/времени класса Formatter .

4. Преобразование с использованием Java 8 Date/Time API

API Date/Time из Java 8 намного мощнее, чем классы java.util.Date и java.util.Calendar , и мы должны использовать его везде, где это возможно. Давайте посмотрим, как мы можем использовать его для преобразования нашего существующего объекта Date в String .

На этот раз мы будем использовать класс DateTimeFormatter и его метод format() , а также тот же шаблон даты, объявленный в Разделе 2.1:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);

Чтобы использовать новый API, нам нужно преобразовать наш объект Date в объект Instant :

Instant instant = date.toInstant();

Поскольку наша ожидаемая строка содержит как дату, так и время, нам также необходимо преобразовать объект Instant в LocalDateTime :

LocalDateTime ldt = instant
.atZone(ZoneId.of("CET"))
.toLocalDateTime();

И, наконец, мы можем легко получить нашу отформатированную строку :

String formattedDate = ldt.format(formatter);

5. Вывод

В этой статье мы проиллюстрировали несколько способов преобразования объектов java.util.Date в String . Сначала мы показали, как это сделать, используя старые классы java.util.Date и java.util.Calendar и соответствующие классы форматирования даты.

Затем мы использовали класс Formatter и, наконец, Java 8 Date/Time API.

Как всегда, полный исходный код можно найти на GitHub .