Java 8 Date/Time API, эквивалентный 'new Date().toString()'

Есть ли эквивалент new Date().toString() (Date из java.util.Date) в новом API даты и времени Java 8?

Если я сделаю следующее:

System.out.println(new Date());

это дает мне по умолчанию хороший читаемый результат, например:

Сб, 3 января 12:58:46 CET 2015

(немного зависит от региона)

В Java 8 (новые способы, я знаю, что описанный выше способ все еще работает) я вижу следующие способы получить строку даты «напрямую» (без дополнительного форматирования):

System.out.println(Clock.systemUTC().instant());

приводит к чему-то вроде:

2015-01-03T12:03:58.614Z

Это не совсем читабельно и требует дополнительного форматирования.

Другой путь:

System.out.println(LocalDateTime.now());

приводит к:

2015-01-03T13:00:58.594

Это почти то же самое, что и предыдущее, но без часового пояса Z в конце.

Поскольку желаемая строка даты также должна содержать часовой пояс, я попробовал следующее:

System.out.println(ZonedDateTime.now());

Это печатает:

2015-01-03T13:00:35.277+01:00[Европа/Берлин]

что тоже непригодно.

Я знаю, что могу легко отформатировать дату, передав экземпляр DateTimeFormatter методу format() ZonedDateTime или используя один из существующих, например:

System.out.println(ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME));

распечатывает:

Сб, 3 янв. 2015 13:01:25 +0100

что было бы приемлемо для меня в качестве результата. Но это требует дополнительного форматирования, чего я хочу избежать.

Итак, есть ли способ получить что-то похожее, если не эквивалентное new Date().toString(), с новыми классами Date-Time Java 8?


person unwichtich    schedule 03.01.2015    source источник
comment
Если вам нужно Date.toString(), почему бы не использовать его?   -  person Kayaman    schedule 04.01.2015
comment
Потому что для этого требуется объект Date, и я хочу использовать новый API для работы с датами...   -  person unwichtich    schedule 04.01.2015
comment
Тогда вам придется использовать форматирование. Я не знаю, почему вы хотите избежать этого в любом случае. Это единственный безопасный способ убедиться, что вы получите даты, которые вы хотите.   -  person Kayaman    schedule 04.01.2015
comment
Почему вы не используете DateFormat?   -  person Nemolovich    schedule 04.01.2015
comment
Это не совсем читаемо - дело вкуса. На самом деле я нахожу форматирование ISO более удобным для чтения.   -  person a_horse_with_no_name    schedule 04.01.2015
comment
Эти нечитаемые форматы определяются стандартом ISO 8601. Они на самом деле вполне удобочитаемы несколькими способами: они однозначно точны, интуитивно понятны практически для любой культуры и сортируются в алфавитном порядке в хронологическом порядке. Хотя эти форматы не предназначены для обычного представления большинству пользователей, эти форматы чрезвычайно полезны для программистов во отладка, системные администраторы в журналах, бухгалтеры в журналах аудита, другие системы, обменивающиеся сериализованными данными, и другие подобные сценарии.   -  person Basil Bourque    schedule 04.01.2015


Ответы (1)


Вам нужно использовать средство форматирования для репликации формата java.util.Date. Объявите средство форматирования с помощью шаблона:

private static final DateTimeFormatter FORMATTER =
    DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy");

(рекомендуется использовать константу static)

Затем используйте ZonedDateTime и отформатируйте его с помощью одного из следующих методов:

ZonedDateTime zdt = ZonedDateTime.now();
System.out.println(zdt.format(FORMATTER));
System.out.println(FORMATTER.format(zdt));

См. также DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG) для более локализованных форматов.

person JodaStephen    schedule 04.01.2015