Преобразование java.время.LocalDate в java.утиль.тип Date
Я хочу, чтобы преобразовать java.time.LocalDate на java.util.Date тип. Потому что я хочу установить дату в JDateChooser. Или есть ли какой-либо выбор даты, который поддерживает java.time даты?
11 ответов:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());это предполагает, что ваш выбор даты использует системный часовой пояс по умолчанию для преобразования дат в строки.
вот служебный класс, который я использую для преобразования нового
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.
можно использовать
java.sql.Date.valueOf()способ как:Date date = java.sql.Date.valueOf(localDate);нет необходимости добавлять информацию о времени и часовом поясе здесь, потому что они принимаются неявно.
Смотрите LocalDate на java.утиль.Дата и наоборот самое простое преобразование?
java.время имеет временной интерфейс, который можно использовать для создания мгновенных объектов из большинства классов времени. Instant представляет собой миллисекунды на временной шкале в эпоху-базовую ссылку для всех других дат и времен.
нам нужно преобразовать дату в ZonedDateTime, с временем и зоной, чтобы сделать преобразование:
LocalDate ldate = ...; Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT"))); Date date = Date.from(instant);
это работает для меня:
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--
для создания java.утиль.Дата С java.время.LocalDate вы должны
- добавить время к LocalDate
- интерпретировать дату и время в пределах часового пояса
- получить количество секунд / миллисекунд, начиная с эпохи
- создать java.утиль.Дата
код может выглядеть следующим образом:
LocalDate localDate = LocalDate.now(); Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
Решение Котлин:
1) вставьте эту функцию расширения где-нибудь.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())2) Используйте его, и никогда не google это снова.
val myDate = myLocalDate.toDate()
альтернативно, кроме преобразования
LocalDateдоInstantможно сделать так:new Date(localDate.toEpochDay() * DateUtils.MILLIS_PER_DAY);здесь
DateUtils.MILLIS_PER_DAYСcommons-lang3.конечно, это так же неточно, как
Dateкогда существуют прыжковые секунды, что также является причиной, по которой мы не должны использовать
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()); }
простой
public Date convertFrom(LocalDate date) { return java.sql.Timestamp.valueOf(date.atStartOfDay()); }
Это решение здесь немного дольше, и вы могли бы включить что-то на время здесь, но, насколько я понимаю, ваша проблема вам просто нужна фактическая дата.
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.
Comments