logo

Java 8: преобразование Instant в строку с датой и временем

Быстрый ответ

Чтобы преобразовать Instant в строковый формат, воспользуйтесь следующим кодом:

Java
Скопировать код
String formatted = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                                    .format(Instant.now().atOffset(ZoneOffset.UTC));

Для корректного форматирования Instant особенно важно указать ZoneOffset, что и реализовано в преведённом выше коде, для достижения нужного формата времени.

При работе с Instant и DateTimeFormatter обратите внимание на правильный выбор часового пояса и локали, чтобы избежать неожиданных результатов. Вот несколько советов:

  • Выбор подходящего пояса: Устанавливайте нужный ZoneId или ZoneOffset.
Java
Скопировать код
// Для приложения, имеющего сделок только с часовым поясом Хогвартса
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                                               .withZone(ZoneId.of("Europe/London"));
  • Форматирование с учётом локали: Применяйте разные локали для корректного отображения даты и времени.
Java
Скопировать код
// Адаптируем формат для Signor Mario
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                                               .withLocale(Locale.ITALY);

Ремесло форматирования DateTimeFormatter

У DateTimeFormatter в арсенале множество встроенных форматеров и возможности для их настройки. Рассмотрим формат ISO-8601 и индивидуальные варианты:

Форматер, совместимый с ISO-8601

Используйте DateTimeFormatter.ISO_INSTANT для форматирования по стандарту ISO-8601:

Java
Скопировать код
// Если это стандарт, который идёт на пользу, то он подходит и мне
String isoFormatted = DateTimeFormatter.ISO_INSTANT.format(Instant.now());

Создание собственного стиля

Определите личный шаблон форматирования и примените DateTimeFormatter для его реализации:

Java
Скопировать код
// Тем, кто предпочитает подробность и длинные тексты
DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("EEE, MMM dd, yyyy HH:mm:ss");
String customFormatted = customFormatter.format(ZonedDateTime.now());

Прелесть локализации

Для тех, кто предпочитает локализованные варианты, можно использовать метод ofLocalizedDateTime:

Java
Скопировать код
DateTimeFormatter localFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
                                                    .withLocale(Locale.JAPAN);
String localFormatted = localFormatter.format(ZonedDateTime.now());

Визуализация

Представьте Instant как глобальные часы (🌍⏰), а DateTimeFormatter — как локальное приглашение на вечеринку (💌), учитывающее часовой пояс для приглашённых гостей.

Markdown
Скопировать код
Глобальные часы (🌍⏰): 2023-03-25T12:00:00Z (Мировое координированное время)
Локальное приглашение (💌): Нужен "часовой пояс" для подбора правильного времени события

Когда мы пытаемся сразу наложить 💌 на 🌍⏰:

plaintext
Скопировать код
🌍⏰ -> 💌 = 💥 (UnsupportedTemporalTypeException)

Для корректного форматирования свяжите 🌍⏰ с конкретным часовым поясом:

plaintext
Скопировать код
🌍⏰ + Часовой пояс (🏙️) -> Корректировка часов (🕰️) -> 💌 = 😊 (Корректно отформатированное время)

Instant – это точное время, но его можно разное

При форматировании Instant мы стремимся к точности и читаемости:

Точность до миллисекунды

При выводе Instant, чтобы отображать миллисекунды:

Java
Скопировать код
// Миллисекунды устанавливают новый стандарт
Instant now = Instant.now().truncatedTo(ChronoUnit.MILLIS);

Легкость восприятия

Улучшите читабельность, удалив из вывода Instant.toString() символы "T" и "Z":

Java
Скопировать код
// Символы "T" и "Z" могут показаться не на своём месте
String readableInstant = Instant.now().toString().replace("T", " ").replace("Z", "");

Совместимость форматера

Убедитесь, что шаблоны в вашем DateTimeFormatter совместимы с Instant:

Java
Скопировать код
// Постобработка формата для чистого вывода
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss 'UTC'");

Пользовательские предпочтения

Готовы предложить поддержку динамического выбора часовых поясов? Вперёд!

Полезные материалы

  1. UnsupportedTemporalTypeException (Java Platform SE 8) — Официальная JavaDoc документация по данному исключению.
  2. DateTimeFormatter (Java Platform SE 8) — Документация по DateTimeFormatter.
  3. Instant (Java Platform SE 8) — Описание класса Instant в JavaDoc.
  4. Различие между Instant и ZonedDateTime – обсуждение на Stack Overflow — Объясняющая тема на Stack Overflow.
  5. Углубленный взгляд на Java 8 Date and Time API – DZone — Статья о возможностях API даты и времени в Java 8.