#java #java-8 #java-time
#java #java-8 #java-время
Вопрос:
Как я могу преобразовать java.time.temporal.Temporal
экземпляр в java.util.Date
инстанс?
java.time.temporal.Temporal someTemporal = Instant.now();
java.util.Date some Temporal = x(someTemporal);
Я просмотрел устаревшую документацию Oracle по отслеживанию времени, но не смог найти подходящее решение.
Комментарии:
1. Тип
Temporal
настолько общий и абстрактный, что практически невозможно найти решение, т.е. преобразование вjava.util.Date
. Рассмотрим, например, типLocalDate
. Как вы можете преобразовать его без какой-либо контекстуальной информации, такой как часовой пояс или время на часах?2. Однако, если вы просто хотите преобразовать
java.time.Instant
, то это довольно просто. Посмотрите на APIjava.util.Date
. (см. Методfrom(Instant)
).
Ответ №1:
Я настоятельно рекомендую исключить любые ссылки на (слишком) общий интерфейс java.time.temporal.Temporal
и просто сделать это:
java.util.Date some = java.util.Date.from(Instant.now());
Использование интерфейса Temporal
почти похоже на использование java.lang.Object
. Вы должны быть как можно более конкретными (особенно в контексте даты и времени). Даже JSR-310-API официально выдает предупреждение:
Этот интерфейс является интерфейсом уровня фреймворка, который не должен широко использоваться в коде приложения. Вместо этого приложения должны создавать и передавать экземпляры конкретных типов, таких как LocalDate. Для этого есть много причин, часть из которых заключается в том, что реализации этого интерфейса могут быть в календарных системах, отличных от ISO. Смотрите ChronoLocalDate для более полного обсуждения проблем.
Ответ №2:
Внизу он имеет:
Хотя java.time.format.DateTimeFormatter предоставляет мощный механизм для форматирования значений даты и времени, вы также можете использовать классы на основе java.time temporal напрямую с java.util.Средства форматирования и String.format, используя то же форматирование на основе шаблонов, которое вы используете с классами даты и времени java.util.
Похоже, вы можете захотеть использовать класс DateTimeFormatter с документацией здесь и, возможно, использовать что-то вроде этого примера:
LocalDate date = LocalDate.now();
String text = date.format(formatter);
LocalDate parsedDate = LocalDate.parse(text, formatter);
Комментарии:
1. @MenoHochschild прав, и мой ответ предоставляет ему LocalDate, который представляет собой формат даты и может быть преобразован в java.util. Объект даты.
2. @TrevorYokum Вопрос касается преобразования в java.util.Date. Ваш ответ не имеет к этому никакого отношения…
Ответ №3:
Я думаю, вы задали этот вопрос немного неправильно. Скорее, я полагаю, вы хотите, как мне преобразовать любой конкретный класс java.time, например Instant, LocalDate, в дату, используя универсальный интерфейс. TemporalAccessor
Я полагаю, что это тот интерфейс.
@Test
public void convertTemportalAccessorTypeToDate() throws Exception {
Instant instant = Instant.now();
Date expected = Date.from( instant );
TemporalAccessor now = instant;
long nanos = now.getLong( ChronoField.NANO_OF_SECOND );
long epochSeconds = now.getLong( ChronoField.INSTANT_SECONDS );
Date date1 = Date.from( Instant.ofEpochSecond( epochSeconds, nanos ) );
assertThat( date1, is( expected ));
}
тем не менее, конкретный тип на самом деле должен поддерживать ChronoField
, и, похоже, выдает UnsupportedTemporalTypeException
, если это не так, так что, возможно, оберните в try catch .