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 .