Java 8: преобразование Instant в строку с датой и временем
Быстрый ответ
Чтобы преобразовать Instant
в строковый формат, воспользуйтесь следующим кодом:
String formatted = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.format(Instant.now().atOffset(ZoneOffset.UTC));
Для корректного форматирования Instant
особенно важно указать ZoneOffset
, что и реализовано в преведённом выше коде, для достижения нужного формата времени.
Навигация по часовым поясам и локали
При работе с Instant
и DateTimeFormatter
обратите внимание на правильный выбор часового пояса и локали, чтобы избежать неожиданных результатов. Вот несколько советов:
- Выбор подходящего пояса: Устанавливайте нужный
ZoneId
илиZoneOffset
.
// Для приложения, имеющего сделок только с часовым поясом Хогвартса
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.of("Europe/London"));
- Форматирование с учётом локали: Применяйте разные локали для корректного отображения даты и времени.
// Адаптируем формат для 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:
// Если это стандарт, который идёт на пользу, то он подходит и мне
String isoFormatted = DateTimeFormatter.ISO_INSTANT.format(Instant.now());
Создание собственного стиля
Определите личный шаблон форматирования и примените DateTimeFormatter
для его реализации:
// Тем, кто предпочитает подробность и длинные тексты
DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("EEE, MMM dd, yyyy HH:mm:ss");
String customFormatted = customFormatter.format(ZonedDateTime.now());
Прелесть локализации
Для тех, кто предпочитает локализованные варианты, можно использовать метод ofLocalizedDateTime
:
DateTimeFormatter localFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.JAPAN);
String localFormatted = localFormatter.format(ZonedDateTime.now());
Визуализация
Представьте Instant
как глобальные часы (🌍⏰), а DateTimeFormatter
— как локальное приглашение на вечеринку (💌), учитывающее часовой пояс для приглашённых гостей.
Глобальные часы (🌍⏰): 2023-03-25T12:00:00Z (Мировое координированное время)
Локальное приглашение (💌): Нужен "часовой пояс" для подбора правильного времени события
Когда мы пытаемся сразу наложить 💌
на 🌍⏰
:
🌍⏰ -> 💌 = 💥 (UnsupportedTemporalTypeException)
Для корректного форматирования свяжите 🌍⏰
с конкретным часовым поясом:
🌍⏰ + Часовой пояс (🏙️) -> Корректировка часов (🕰️) -> 💌 = 😊 (Корректно отформатированное время)
Instant – это точное время, но его можно разное
При форматировании Instant
мы стремимся к точности и читаемости:
Точность до миллисекунды
При выводе Instant
, чтобы отображать миллисекунды:
// Миллисекунды устанавливают новый стандарт
Instant now = Instant.now().truncatedTo(ChronoUnit.MILLIS);
Легкость восприятия
Улучшите читабельность, удалив из вывода Instant.toString()
символы "T" и "Z":
// Символы "T" и "Z" могут показаться не на своём месте
String readableInstant = Instant.now().toString().replace("T", " ").replace("Z", "");
Совместимость форматера
Убедитесь, что шаблоны в вашем DateTimeFormatter
совместимы с Instant
:
// Постобработка формата для чистого вывода
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss 'UTC'");
Пользовательские предпочтения
Готовы предложить поддержку динамического выбора часовых поясов? Вперёд!
Полезные материалы
- UnsupportedTemporalTypeException (Java Platform SE 8) — Официальная JavaDoc документация по данному исключению.
- DateTimeFormatter (Java Platform SE 8) — Документация по
DateTimeFormatter
. - Instant (Java Platform SE 8) — Описание класса
Instant
в JavaDoc. - Различие между Instant и ZonedDateTime – обсуждение на Stack Overflow — Объясняющая тема на Stack Overflow.
- Углубленный взгляд на Java 8 Date and Time API – DZone — Статья о возможностях API даты и времени в Java 8.