Преобразовать java.time.LocalDate в тип java.util.Date

Я хочу преобразовать java.time.LocalDate в тип java.util.Date. Потому что я хочу установить дату в JDateChooser. Или есть ли какой-либо выбор даты, который поддерживает java.time даты?

Ответ 1

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

Предполагает, что ваш выбор даты использует часовой пояс системы по умолчанию для преобразования дат в строки.

Ответ 2

Вот класс утилиты, который я использую для преобразования более новых классов java.time в объекты java.util.Date и наоборот:

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateUtils {

  public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  }

  public static Date asDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  public static LocalDate asLocalDate(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
  }

  public static LocalDateTime asLocalDateTime(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
  }
}

Отредактировано на основе комментария @Oliv.

Ответ 4

java.time имеет временный интерфейс, который вы можете использовать для создания мгновенных объектов из большинства классов времени. Instant представляет миллисекунды на временной шкале в эпоху - базовую ссылку для всех других дат и времени.

Нам нужно преобразовать Date в ZonedDateTime с временем и зоной для преобразования:

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);

Ответ 5

Чтобы создать java.util.Date из java.time.LocalDate, вам нужно

  • добавить время в LocalDate
  • интерпретировать дату и время в часовом поясе
  • получить количество секунд/миллисекунд с эпохи
  • создать java.util.Date

Код может выглядеть следующим образом:

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);

Ответ 7

Kotlin Решение:

1) Вставьте эту функцию расширения где-нибудь.

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2) Используйте его, и никогда не делайте это снова.

val myDate = myLocalDate.toDate()

Ответ 8

LGoodDatePicker изначально использует пакет java.time(например, Java 8 time или JSR-310). Более конкретно, LGoodDatePicker использует "java.time.LocalDate" для хранения значений выбора даты. Это хороший вариант выбора даты. На главной странице проекта есть скриншоты и демонстрация.

Страница проекта находится здесь:
https://github.com/LGoodDatePicker/LGoodDatePicker

Ответ 9

Альтернативно, кроме преобразования LocalDate в Instant, можно сделать следующее:

new Date(localDate.toEpochDay() * DateUtils.MILLIS_PER_DAY);

где DateUtils.MILLIS_PER_DAY - из commons-lang3.

Конечно, это так же неточно, как Date когда существуют прыжки секунд, что также является причиной того, что мы больше не должны использовать java.util.Date.

Ответ 10

public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
    return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
} 

Ответ 11

Простой

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}

Ответ 12

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

int day = this.datePicker2.getDate().getDayOfMonth();
int month = this.datePicker2.getDate().getMonthValue();
int year = this.datePicker2.getDate().getYear();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
calendar.set(Calendar.DATE, day);
Date date = calendar.getTime();

Не может выглядеть так элегантно, но он работает. Примечание: используется месяц-1, потому что месяцы в календаре начинаются с 0.