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.
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 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);
Puede usar el método java.sql.Date.valueOf()
como:
Date date = java.sql.Date.valueOf(localDate);
No es necesario agregar aquí la información de la zona horaria, ya que se toman de forma implícita.
Consulte LocalDate to java.util.Date y viceversa, ¿la conversión más simple?
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());
}