1. Обзор
В этом уроке мы покажем, как мы можем преобразовать Date объекты в String объекты в Java . Для этого мы будем работать со старым java.util.Дата тип, а также с новым Дата/Время API, введенным в Java 8.
Если вы хотите узнать, как выполнить обратное преобразование, т. Е. из String в Date типы, вы можете проверить этот учебник здесь .
Для получения более подробной информации о новой Дате/Времени API, пожалуйста, смотрите этот связанный учебник .
2. Преобразование java.util.Дата в строку
Хотя мы не должны использовать java.util.Date если мы работаем с Java 8, иногда у нас нет выбора (например, мы получаем объект Date из библиотеки, которая не находится под нашим контролем).
В таких случаях у нас есть несколько способов преобразования java.util.Дата до Строка в нашем распоряжении.
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";
Теперь нам нужен фактический Дата объект, который мы хотели бы преобразовать. Для его создания мы будем использовать экземпляр Calendar :
TimeZone.setDefault(TimeZone.getTimeZone("CET")); Calendar calendar = Calendar.getInstance(); calendar.set(2018, Calendar.AUGUST, 1, 12, 0); Date date = calendar.getTime();
Мы установили по умолчанию Часовой пояс в CET , чтобы предотвратить проблемы при работе с новым API позже. Следует отметить, что дата сама по себе не имеет часового пояса, но ее 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);
При таком подходе мы передаем шаблоны стилей — MEDIUM для даты и SHORT для времени в нашем случае.
3. Использование класса форматирования
Другой простой способ получить ту же строку , что и в предыдущих примерах, – использовать класс Formatter .
Хотя это может быть не самое читаемое решение, это потокобезопасный однострочный файл, который может быть полезен, особенно в многопоточной среде (мы должны иметь в виду, что SimpleDateFormat не является потокобезопасным):
String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);
Мы использовали 1$ , чтобы указать, что мы будем передавать только один аргумент, который будет использоваться с каждым флагом. Подробное объяснение флагов можно найти в разделе Преобразования даты/времени класса форматирования .
4. Преобразование С помощью Java 8 Date/Time API
API Date/Time из Java 8 намного мощнее, чем java.util.Дата и java.util.Календарь классы, и мы должны использовать его, когда это возможно. Давайте посмотрим, как мы можем использовать его для преобразования нашего существующего объекта Date в String .
На этот раз мы будем использовать класс DateTimeFormatter и его метод format () , а также тот же шаблон даты, объявленный в разделе 2.1:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
Чтобы использовать новый API, нам нужно преобразовать наш Data объект в Instant объект:
Instant instant = date.toInstant();
Поскольку наша ожидаемая Строка имеет как части даты, так и части времени, нам также необходимо преобразовать объект Instant в LocalDateTime :
LocalDateTime ldt = instant .atZone(ZoneId.of("CET")) .toLocalDateTime();
И, наконец, мы можем легко получить нашу отформатированную строку :
String formattedDate = ldt.format(formatter);
5. Заключение
В этой статье мы проиллюстрировали несколько способов преобразования java.util.Дата объекты в Строку . Сначала мы показали, как это сделать, используя более старый java.util.Дата и java.util.Календарь классы и соответствующие классы форматирования дат.
Затем мы использовали класс Formatter и, наконец, API даты и времени Java 8.
Как всегда, полный исходный код можно найти на GitHub .