tl; др
myUtilDate.toInstant() // Convert `java.util.Date` to `Instant`.
.atOffset( ZoneOffset.UTC ) // Transform `Instant` to `OffsetDateTime`.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a String.
.replace( "T" , " " ) // Put a SPACE in the middle.
2014-11-14 14: 05: 09
java.time
Современный способс классами java.time, которые теперь вытесняют проблемные старые унаследованные классы даты и времени.
Сначала преобразуйте java.util.Date
в Instant
.Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Преобразования в / из java.time выполняются новыми методами, добавленными к старым классам.
Instant instant = myUtilDate.toInstant();
Оба ваших java.util.Date
и java.time.Instant
находятся в UTC .Если вы хотите видеть дату и время как UTC, пусть будет так.Вызовите toString
для генерации строки в стандартном формате ISO 8601 .
String output = instant.toString();
2014-11-14T14: 05: 09Z
Для других форматов вам необходимо преобразовать Instant
в более гибкий OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
odt.toString (): 2014-11-14T14:05: 09 + 00: 00
Чтобы получить строку в нужном формате, укажите DateTimeFormatter
.Вы можете указать пользовательский формат.Но я бы использовал один из предопределенных форматеров (ISO_LOCAL_DATE_TIME
) и заменил T
в его выводе пробелом.
String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14: 05: 09
Кстати, я не рекомендую такой формат, когда вы намеренно теряете offset-from-UTC или информацию о часовом поясе.Создает неоднозначность относительно значения даты-времени этой строки.
Также остерегайтесь потери данных, поскольку любая дробная секунда игнорируется (эффективно усекается) в представлении вашей строки значения даты-времени.
Чтобы увидеть тот же момент через линзу времени настенных часов некоторого конкретного региона , примените ZoneId
, чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Америка / Монреаль]
Чтобы создать форматированную строку, сделайте то же, что и выше, но замените odt
с zdt
.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14: 05: 09
Если вы выполняете этот код очень много раз, вы можете захотетьбыть немного более эффективным и избегать звонка на String::replace
.Удаление этого вызова также делает ваш код короче.При желании укажите свой собственный шаблон форматирования в своем собственном объекте DateTimeFormatter
.Кэшируйте этот экземпляр как константу или член для повторного использования.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ); // Data-loss: Dropping any fractional second.
Примените этот форматер, передав экземпляр.
String output = zdt.format( f );
О java.time
java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют неприятные старые классы даты и времени, такие как java.util.Date
, .Calendar
и & java.text.SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time.
Чтобы узнать больше, см. Oracle Tutorial .И найдите в Stack Overflow множество примеров и объяснений.
Большая часть функциональности java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android in ThreeTenABP (см. Как использовать… ).
Проект ThreeTen-Extra расширяет Java. время с дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.