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

Форматировать Instant в строку в Java

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

1. Обзор

В этом уроке мы собираемся пролить свет на то, как отформатировать момент в String в Java .

Во-первых, мы начнем с небольшого предыстории того, что такое момент в Java. Затем мы покажем, как ответить на наш главный вопрос, используя ядро Java и сторонние библиотеки, такие как Joda-Time.

2. Форматирование Instant с помощью Core Java

Согласно документации Java , момент — это измеренная временная метка эпохи Java 1970-01-01T00:00:00Z.

Java 8 поставляется с удобным классом Instant для представления конкретной мгновенной точки на временной шкале. Как правило, мы можем использовать этот класс для записи временных меток событий в наших приложениях.

Теперь, когда мы знаем, что такое момент в Java, давайте посмотрим, как мы можем преобразовать его в объект String .

2.1. Использование класса DateTimeFormatter

Вообще говоря, нам понадобится средство форматирования для форматирования объекта Instant . К счастью для нас, в Java 8 появился класс DateTimeFormatter для унифицированного форматирования даты и времени.

По сути, DateTimeFormatter предоставляет метод format() для выполнения этой работы.

Проще говоря, DateTimeFormatter требует часового пояса для форматирования мгновенного файла . Без него он не сможет преобразовать мгновенное значение в удобочитаемые поля даты/времени.

Например, предположим, что мы хотим отобразить экземпляр Instant в формате dd.MM.yyyy :

public class FormatInstantUnitTest {

private static final String PATTERN_FORMAT = "dd.MM.yyyy";

@Test
public void givenInstant_whenUsingDateTimeFormatter_thenFormat() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(PATTERN_FORMAT)
.withZone(ZoneId.systemDefault());

Instant instant = Instant.parse("2022-02-15T18:35:24.00Z");
String formattedInstant = formatter.format(instant);

assertThat(formattedInstant).isEqualTo("15.02.2022");
}
...
}

Как показано выше, мы можем использовать метод withZone() для указания часового пояса.

Имейте в виду, что отсутствие указания часового пояса приведет к UnsupportedTemporalTypeException :

@Test(expected = UnsupportedTemporalTypeException.class)
public void givenInstant_whenNotSpecifyingTimeZone_thenThrowException() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(PATTERN_FORMAT);

Instant instant = Instant.now();
formatter.format(instant);
}

2.2. Использование метода toString()

Другим решением может быть использование метода toString() для получения строкового представления объекта Instant .

Давайте проиллюстрируем использование метода toString () на тестовом примере :

@Test
public void givenInstant_whenUsingToString_thenFormat() {
Instant instant = Instant.ofEpochMilli(1641828224000L);
String formattedInstant = instant.toString();

assertThat(formattedInstant).isEqualTo("2022-01-10T15:23:44Z");
}

Ограничение этого подхода заключается в том, что мы не можем использовать пользовательский, удобный для человека формат для отображения мгновенного .

3. Библиотека Джода-Время

В качестве альтернативы мы можем использовать API Joda-Time для достижения той же цели. Эта библиотека предоставляет набор готовых к использованию классов и интерфейсов для управления датой и временем в Java.

Среди этих классов мы находим класс DateTimeFormat . Как следует из названия, этот класс можно использовать для форматирования или анализа данных даты/времени в строке и обратно .

Итак, давайте проиллюстрируем, как использовать DateTimeFormatter для преобразования мгновения в строку:

@Test
public void givenInstant_whenUsingJodaTime_thenFormat() {
org.joda.time.Instant instant = new org.joda.time.Instant("2022-03-20T10:11:12");

String formattedInstant = DateTimeFormat.forPattern(PATTERN_FORMAT)
.print(instant);

assertThat(formattedInstant).isEqualTo("20.03.2022");
}

Как мы видим, DateTimeFormatter предоставляет forPattern() для указания шаблона форматирования и print() для форматирования объекта Instant .

4. Вывод

Подводя итог, в этой статье мы подробно рассмотрели, как отформатировать момент в строку в Java.

Попутно мы рассмотрели несколько способов добиться этого с помощью основных методов Java. Затем мы объяснили, как сделать то же самое с помощью библиотеки Joda-Time.

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