Quiero convertir java.time.LocalDate
en java.util.Date
tipo. Porque quiero establecer la fecha en JDateChooser
. ¿O hay algún selector de fecha que admita java.time
fechas?
Quiero convertir java.time.LocalDate
en java.util.Date
tipo. Porque quiero establecer la fecha en JDateChooser
. ¿O hay algún selector de fecha que admita java.time
fechas?
Respuestas:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Eso supone que su selector de fecha utiliza la zona horaria predeterminada del sistema para transformar las fechas en cadenas.
atStartOfDay()
, ya que cambia el valor de la fecha, según tengo entendido?
Aquí hay una clase de utilidad que uso para convertir las java.time
clases más nuevas en java.util.Date
objetos 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.
ZoneId.systemDefault()
problemático porque las zonas horarias cambian a lo largo del año. Entonces, si el 01-enero estoy en la zona horaria -05: 00 (central), pero luego el 01-julio estoy en la zona horaria -06: 00 (luz del día central), ¿eso no causará resultados inexactos debido al horario de verano? ¿hora?
Puedes usar el java.sql.Date.valueOf()
método como:
Date date = java.sql.Date.valueOf(localDate);
No es necesario agregar información de hora y zona horaria aquí porque se toman implícitamente.
Ver LocalDate a java.util.Date y viceversa, ¿la conversión más simple?
java.sql.Date
está destinado a la capa de base de datos, JDBC, JPA. La capa web (o cualquier aplicación cliente) debe estar absolutamente libre de cualquier dependencia de java.sql.*
.
java.sql.Date
es solo java.util.Date
con su tiempo establecido, 00:00:00
pero el punto en la perspectiva del diseño es que java.sql.*
no está destinado a una capa frontal con la que los clientes interactúan como Servlets / JSP. java.util.Date
en el lado de Java y / java.sql.Timestamp
o lo que sea aplicable desde el java.sql.*
lado de JDBC .
java.sql.*
clases serán una dependencia separada.
java.time tiene la interfaz Temporal que puede usar 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);
Para crear un java.util.Date a partir de un java.time.LocalDate , debe
El código podría tener el siguiente aspecto:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
se hereda de java.time.chrono.ChronoZonedDateTime
. Ver docs.oracle.com/javase/8/docs/api/java/time/chrono/…
Esto funciona para mi:
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--
Solución Kotlin:
1) Pegue esta función de extensión en alguna parte.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) Úselo y nunca vuelva a googlear esto.
val myDate = myLocalDate.toDate()
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());
}
Simple
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());