конвертировать java.util.Date в строку

Конвертировать java.util.Date в строку

1. обзор

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

Если вы хотите узнать, как выполнить обратное преобразование, т. Е. Из типовString вDate, вы можете проверитьthis tutorial here.

Для получения дополнительных сведений о новом APIDate/Time см.this related tutorial.

2. Преобразованиеjava.util.Date вString

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

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

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

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

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();

Мы установили по умолчаниюTimeZone наCET, чтобы предотвратить проблемы при работе с новым API позже. Отметим, чтоthe Date itself doesn’t have any time zone, but its toString() uses the current default time zone.

Мы будем использовать этот экземпляр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

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

Хотя это может быть не самое читаемое решение,it is a thread-safe one-liner that could be useful, especially in a multi-threaded environment (мы должны помнить, чтоSimpleDateFormat не является потокобезопасным):

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

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

4. Конвертация с использованием Java 8Date/Time API

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

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

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);

Чтобы использовать новый API, нам нужноconvert our Date object to an Instant object:

Instant instant = date.toInstant();

Поскольку наш ожидаемыйString имеет как дату, так и время,we also need to convert the Instant object to LocalDateTime:

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

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

String formattedDate = ldt.format(formatter);

5. Заключение

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

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

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