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 .