it-swarm.com.ru

LocalDate для Java.util.Date и наоборот самое простое преобразование?

Есть ли простой способ преобразовать LocalDate (представленный в Java 8) в объект Java.util.Date

Под «простым» я подразумеваю более простой, чем этот: 

Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

что мне немного неловко 

Поскольку нас интересует только часть даты, а информация о часовом поясе отсутствует ни в одном из объектов, зачем вводить часовые пояса в явном виде? Время полуночи и системный часовой пояс по умолчанию должны приниматься неявно для преобразования.

98
George

На самом деле есть. В объекте Java.sql.Date есть статический метод valueOf , который делает именно это. Итак, мы имеем

Java.util.Date date = Java.sql.Date.valueOf(localDate);

и это все. Нет явной установки часовых поясов, потому что местный часовой пояс взят неявно.

Из документов:

Предоставленная LocalDate интерпретируется как локальная дата в локальном часовой пояс.

Подклассы Java.sql.DateJava.util.Date, так что результатом также является Java.util.Date.

А для обратной операции в классе Java.sql.Date есть метод toLocalDate . Итак, мы имеем:

LocalDate ld = new Java.sql.Date(date.getTime()).toLocalDate();

117
George

тЛ; др

Есть ли простой способ преобразовать LocalDate (представленный в Java 8) в объект Java.util.Date? Под «простым» я имею в виду более простой, чем этот

Нету. Вы сделали это правильно и максимально кратко. 

Java.util.Date.from(                     // Convert from modern Java.time class to troublesome old legacy class.  DO NOT DO THIS unless you must, to inter operate with old code not yet updated for Java.time.
    myLocalDate.atStartOfDay(            // Let Java.time determine the first moment of the day on that date in that zone. Never assume the day starts at 00:00:00.
        ZoneId.of( "America/Montreal" )  // Specify time zone using proper name in `continent/region` format, never 3-4 letter pseudo-zones such as “PST”, “CST”, “IST”. 
    )                                    // Produce a `ZonedDateTime` object. 
    .toInstant()                         // Extract an `Instant` object, a moment always in UTC.
)

Читайте ниже для вопросов, а затем подумайте об этом. Как это может быть проще? Если вы спросите меня, во сколько начинается свидание, как еще я могу ответить, но спрашиваю: «Где?»? Новый день наступает раньше в парижском ФР, чем в Монреале, Калифорния, и еще раньше в Калькутте, и даже раньше, в Окленде, Новая Зеландия, все в разные моменты. 

Таким образом, при преобразовании только даты (LocalDate) в дату-время мы должны применить часовой пояс (ZoneId), чтобы получить зонированное значение (ZonedDateTime), а затем перейти в UTC (Instant), чтобы соответствовать определению Java.util.Date.

Подробности

Во-первых, по возможности избегайте старых устаревших классов даты и времени, таких как Java.util.Date. Они плохо разработаны, сбивают с толку и хлопотно. Они были вытеснены классами Java.time по причине, по сути, по многим причинам. 

Но если вам необходимо, вы можете преобразовать типы Java.time в старые и обратно. Ищите новые методы преобразования, добавленные к старым классам.

Java.util.DateJava.time.LocalDate

Имейте в виду, что Java.util.Date является неправильным, поскольку представляет дату plus время суток в UTC. Напротив, класс LocalDate представляет значение только для даты без времени суток и без часового пояса.

Переход от Java.util.Date к Java.time означает преобразование в эквивалентный класс Java.time.Instant. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби). 

Instant instant = myUtilDate.toInstant();

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.

Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция это новый день, а еще "вчера" в Монреаль Квебек .

Поэтому нам нужно переместить этот Instant в часовой пояс. Мы применяем ZoneId, чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

Оттуда попросите только дату, LocalDate.

LocalDate ld = zdt.toLocalDate();

Java.time.LocalDateJava.util.Date

Чтобы перейти в другом направлении, от Java.time.LocalDate к Java.util.Date означает, что мы переходим от даты только к дате и времени. Поэтому мы должны указать время суток. Вы, вероятно, хотите пойти в первый момент дня. Не предполагать, что это 00:00:00. Аномалии, такие как переход на летнее время (DST), означают, что первый момент может быть другим временем, таким как 01:00:00. Пусть Java.time определит это значение, вызвав atStartOfDay для LocalDate.

ZonedDateTime zdt = myLocalDate.atStartOfDay( z );

Теперь извлеките Instant.

Instant instant = zdt.toInstant();

Преобразуйте это Instant в Java.util.Date, вызвав from( Instant ) .

Java.util.Date d = Java.util.Date.from( instant );

Больше информации


О Java.time

Java.time framework встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые унаследованные классы даты и времени, такие как Java.util.Date , Calendar , & SimpleDateFormat .

Проект Joda-Time , теперь находящийся в режиме обслуживания , рекомендует выполнить переход к Java.time классам.

Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация это JSR 310 .

Вы можете обмениваться объектами Java.time непосредственно с вашей базой данных. Используйте драйвер JDBC совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в классах Java.sql.*.

Где взять классы Java.time? 

  • Java SE 8 , Java SE 9 и более поздние версии
    • Встроенный. 
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности Java.time перенесена в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android связывают реализации классов Java.time.
    • Для более ранних версий Android (<26) ThreeTenABP project адаптируется ThreeTen-Backport (упомянуто выше). Смотрите Как использовать ThreeTenABP… .

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

64
Basil Bourque

Дата -> LocalDate:

LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate -> Date:

Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
14
Hai Nguyen

Дата до LocalDate

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate to Date

LocalDate localDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
2
fjkjava

Преобразование LocalDateTime в Java.util.Date

    LocalDateTime localDateTime = LocalDateTime.now();

    ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneOffset.systemDefault());

    Instant instant = zonedDateTime.toInstant();

    Date date = Date.from(instant);

System.out.println("Result Date is : "+date);
0
Simhadri