manejo localdatetime horas fechas fecha example ejemplo java java-8 java-time

localdatetime - Convertir java.time.LocalDate en el tipo java.util.Date



manejo de horas en java (12)

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


Alternativamente, aparte de convertir LocalDate a Instant , se 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 la Date cuando existen segundos de salto, lo cual es también la razón por la que ya no debemos usar java.util.Date .


Aquí hay una clase de utilidad que utilizo para convertir las nuevas clases de java.time en 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 en base al comentario de @Oliv.


Esta solución aquí es un poco más larga y podría incluir algo para el tiempo aquí también, pero hasta donde 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: el mes-1 se usa porque los meses en el calendario comienzan con 0.



Para crear un java.util.Date a partir de un java.time.LocalDate , tienes que

  • agregar un tiempo a la fecha local
  • interpretar la fecha y la hora dentro de una zona horaria
  • obtener el número de segundos / milisegundos desde la época
  • crear un java.util.Date

El código puede verse como sigue:

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



Sencillo

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


java.time tiene la interfaz temporal que puede 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 demás 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);


Solución Kotlin:

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

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

2) Úsalo, y nunca más busques en google.

val myDate = myLocalDate.toDate()


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

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


java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());


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