Рубрики
Без рубрики

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

Изучите несколько методов преобразования объектов данных в строковые объекты в Java.

Автор оригинала: baeldung.

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 .