тл; д-р
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 (): 2020-05-01T21: 25: 35.957Z
Дивіться, що цей код запускається на веб-сайті IdeOne.com .
Щоб отримати рядок у бажаному форматі, вкажіть a DateTimeFormatter
. Ви можете вказати спеціальний формат. Але я б скористався одним із заздалегідь визначених форматів ( ISO_LOCAL_DATE_TIME
) і замінив T
у своєму виході SPACE.
String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
До речі, я не рекомендую такого формату, коли ви навмисно втрачаєте інформацію про зміщення з-за UTC чи часового поясу. Створює неоднозначність щодо значення значення дати та часу цього рядка.
Також остерігайтеся втрати даних, оскільки будь-яка дробова секунда ігнорується (фактично обрізається) у поданні вашої рядки значення дати та часу.
Щоб побачити той самий момент крізь лінзу настінного годинника певного регіону , застосуйте a, 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 каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі класи дати і часу , такі як java.util.Date
, .Calendar
, і java.text.SimpleDateFormat
.
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти на java.time.
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями.
Значна частина функцій java.time підтримується на Java 6 і 7 у ThreeTen-Backport і надалі адаптується до Android у ThreeTenABP (див. Як користуватися… ).
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time.