Вопрос-ответ

Convert java.util.Date to String

Преобразование Java.утиль.Даты в строку

Я хочу преобразовать java.util.Date объект в String на Java.

Формат 2010-05-30 22:15:52

Переведено автоматически
Ответ 1

Преобразовать дату в строку с помощью DateFormat#format метода:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();
// Using DateFormat format method we can create a string
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

Из http://www.kodejava.org/examples/86.html

Ответ 2
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);
Ответ 3

Commons-lang DateFormatUtils полон полезных функций (если у вас есть commons-lang в вашем пути к классу)

//Formats a date/time into a specific pattern
DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");
Ответ 4

tl;dr

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 .

Чтобы получить строку в желаемом формате, укажите DateTimeFormatter. Вы можете указать пользовательский формат. Но я бы использовал один из предопределенных форматеров (ISO_LOCAL_DATE_TIME) и заменил T в его выводе ПРОБЕЛОМ.

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );

2014-11-14 14:05:09


Кстати, я не рекомендую формат такого рода, в котором вы намеренно теряете смещение от UTC или информацию о часовом поясе. Создает двусмысленность относительно значения даты и времени в этой строке.

Также остерегайтесь потери данных, поскольку любая доля секунды игнорируется (фактически усекается) в вашем строковом представлении значения даты-времени.

Чтобы увидеть тот же момент через призму времени на настенных часах определенного региона, примените aZoneId, чтобы получить a 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. А также найдите в Stack Overflow множество примеров и пояснений.

Большая часть функций java.time перенесена обратно на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать ...).

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательным полигоном для возможных будущих дополнений к java.time.

java date