Я хочу преобразовать java.time.LocalDate
в тип java.util.Date
. Потому что я хочу установить дату в JDateChooser
. Или есть ли какой-либо выбор даты, который поддерживает java.time
даты?
Преобразовать java.time.LocalDate в тип java.util.Date
Ответ 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.
Ответ 3
Вы можете использовать метод java.sql.Date.valueOf()
как:
Date date = java.sql.Date.valueOf(localDate);
Не нужно добавлять информацию о времени и часовом поясе здесь, потому что они взяты неявно.
См. LocalDate в java.util.Date и наоборот упрощенное преобразование?
Ответ 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);
Ответ 6
Это работает для меня:
java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--
Ответ 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.