Eu quero converter java.time.LocalDate
em java.util.Date
tipo. Porque eu quero definir a data JDateChooser
. Ou existe algum seletor de data que suporte java.time
datas?
Eu quero converter java.time.LocalDate
em java.util.Date
tipo. Porque eu quero definir a data JDateChooser
. Ou existe algum seletor de data que suporte java.time
datas?
Respostas:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Isso pressupõe que o seletor de datas use o fuso horário padrão do sistema para transformar datas em strings.
atStartOfDay()
, pois altera o valor da data, como eu a entendo.
Aqui está uma classe de utilitário que eu uso para converter as java.time
classes mais recentes em java.util.Date
objetos e vice-versa:
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 com base no comentário do @Oliv.
ZoneId.systemDefault()
problemas porque os fusos horários mudam ao longo do ano. Portanto, se em 01 de janeiro estou no fuso horário -05: 00 (central), mas em 01-julho estou no fuso -06: 00 (horário de verão central) não causará resultados imprecisos devido ao horário de verão Tempo?
Você pode usar o java.sql.Date.valueOf()
método como:
Date date = java.sql.Date.valueOf(localDate);
Não há necessidade de adicionar informações de hora e fuso horário aqui, pois elas são obtidas implicitamente.
Consulte LocalDate para java.util.Date e vice-versa da conversão mais simples?
java.sql.Date
destina-se à camada de banco de dados, JDBC, JPA. A camada da web (ou qualquer aplicativo cliente) deve estar absolutamente livre de qualquer dependência java.sql.*
.
java.sql.Date
é apenas java.util.Date
com o tempo definido, 00:00:00
mas o ponto na perspectiva do design é que java.sql.*
não se destina a uma camada frontal com a qual os clientes interagem, como Servlets / JSP. java.util.Date
no lado Java e java.sql.Timestamp
ou o que for aplicável java.sql.*
no lado JDBC .
java.sql.*
classes serão uma dependência separada.
java.time possui a interface Temporal, que você pode usar para criar objetos Instantâneos na maioria das classes de tempo. Instantâneo representa milissegundos na linha do tempo na época - a referência básica para todas as outras datas e horas.
Precisamos converter a data em um ZonedDateTime, com uma hora e um fuso, para fazer a conversão:
LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Para criar um java.util.Date a partir de um java.time.LocalDate , você deve
O código pode ter a seguinte aparência:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
é herdado de java.time.chrono.ChronoZonedDateTime
. Veja docs.oracle.com/javase/8/docs/api/java/time/chrono/…
Isso funciona para mim:
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--
Solução Kotlin:
1) Cole esta função de extensão em algum lugar.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) Use-o e nunca faça o google novamente.
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());
}
Simples
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());