Преобразовать java.time.temporal.Temporal в java.util.Date

#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 , то это довольно просто. Посмотрите на API java.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 .