Преобразование java.время.LocalDate в java.утиль.тип Date



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

1178   11  

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

    Ничего не найдено.