Convierta java.time.LocalDate en java.util.Date type

Quiero convertir java.time.LocalDate en java.util.Date type. Porque quiero establecer la fecha en JDateChooser . ¿O hay algún selector de fecha que admita java.time fechas de java.time ?

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

Eso supone que el selector de fecha utiliza la zona horaria predeterminada del sistema para transformar las fechas en cadenas.

Aquí hay una clase de utilidad que utilizo para convertir las clases más nuevas de java.time a objetos java.util.Date y viceversa:

 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(); } } 

Editado basado en el comentario de @Oliv.

Puede usar el método java.sql.Date.valueOf() como:

 Date date = java.sql.Date.valueOf(localDate); 

No es necesario agregar aquí información de hora y zona horaria porque se toman implícitamente.
Ver LocalDate a java.util.Date y viceversa, la conversión más simple?

java.time tiene la interfaz temporal que puedes utilizar para crear objetos instantáneos de la mayoría de las clases de tiempo. Instant representa milisegundos en la línea de tiempo en la Época – la referencia base para todas las otras fechas y horas.

Necesitamos convertir la fecha en un ZonedDateTime, con una hora y una zona, para hacer la conversión:

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

Esto funciona para mí:

 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–

Para crear un java.util.Date desde un java.time.LocalDate , debes

  • agregue un tiempo al LocalDate
  • interpretar la fecha y la hora dentro de un huso horario
  • obtener la cantidad de segundos / milisegundos desde la época
  • crea un java.util.Date

El código podría verse de la siguiente manera:

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

Solución de Kotlin:

1) Pegue esta función de extensión en algún lugar.

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

2) Úselo, y nunca googlee esto de nuevo.

 val myDate = myLocalDate.toDate() 

Alternativamente, además de convertir LocalDate a Instant , uno puede hacer esto:

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

donde DateUtils.MILLIS_PER_DAY es de commons-lang3 .

Seguramente esto es tan inexacto como Date cuando existen los segundos intercalares, que es también la razón por la que no deberíamos usar java.util.Date nunca más.

 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()); } 

Sencillo

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

Esta solución aquí es un poco más larga y podría incluir algo por el momento aquí también, pero por lo que entiendo su problema solo necesita la fecha real.

 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(); 

Puede que no se vea tan elegante pero funciona. Nota: mes-1 se usa porque los meses en el calendario comienzan con 0.