Quiero convertir java.time.LocalDateen java.util.Datetipo. Porque quiero establecer la fecha en JDateChooser. ¿O hay algún selector de fecha que admita java.timefechas?
Quiero convertir java.time.LocalDateen java.util.Datetipo. Porque quiero establecer la fecha en JDateChooser. ¿O hay algún selector de fecha que admita java.timefechas?
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.timeclases más nuevas en java.util.Dateobjetos 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.Dateestá 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.Datees solo java.util.Datecon su tiempo establecido, 00:00:00pero 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.Dateen el lado de Java y / java.sql.Timestampo 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);
toEpochSecondse 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());