Voglio convertire java.time.LocalDate
in java.util.Date
tipo. Perché voglio impostare la data in JDateChooser
. O c'è un selettore di date che supporta le java.time
date?
Voglio convertire java.time.LocalDate
in java.util.Date
tipo. Perché voglio impostare la data in JDateChooser
. O c'è un selettore di date che supporta le java.time
date?
Risposte:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Ciò presuppone che il selettore di date utilizzi il fuso orario predefinito del sistema per trasformare le date in stringhe.
atStartOfDay()
, dal momento che cambia il valore della data, come ho capito.
Ecco una classe di utilità che utilizzo per convertire le java.time
classi più recenti in java.util.Date
oggetti e 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();
}
}
Modificato in base al commento di @Oliv.
ZoneId.systemDefault()
problemi perché i fusi orari cambiano nel corso dell'anno. Quindi se il 1 ° gennaio sono nel fuso orario -05: 00 (centrale), ma il 1 ° luglio sono nel fuso orario -06: 00 (luce del giorno centrale) non causerà risultati inaccurati a causa dell'ora legale tempo?
Puoi usare il java.sql.Date.valueOf()
metodo come:
Date date = java.sql.Date.valueOf(localDate);
Non è necessario aggiungere qui le informazioni sull'ora e sul fuso orario perché vengono prese in modo implicito.
Vedi LocalDate in java.util.Date e viceversa la conversione più semplice?
java.sql.Date
è pensato per il livello del database, JDBC, JPA. Il livello Web (o qualsiasi applicazione client) dovrebbe essere assolutamente privo di qualsiasi dipendenza da java.sql.*
.
java.sql.Date
è solo java.util.Date
con il suo tempo impostato, 00:00:00
ma il punto di vista progettuale è che java.sql.*
non è pensato per un livello frontale con cui i clienti interagiscono come Servlet / JSP. java.util.Date
nel lato Java java.sql.Timestamp
eo qualsiasi altra cosa applicabile java.sql.*
nel lato JDBC .
java.sql.*
classi avranno una dipendenza separata.
java.time ha l'interfaccia temporale che puoi usare per creare oggetti istantanei dalla maggior parte delle classi temporali. Instant rappresenta i millisecondi della sequenza temporale nell'epoca, il riferimento di base per tutte le altre date e orari.
Abbiamo bisogno di convertire la data in un ZonedDateTime, con un ora e una zona, per fare la conversione:
LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Per creare un java.util.Date da un java.time.LocalDate , devi farlo
Il codice potrebbe apparire come segue:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
è ereditato da java.time.chrono.ChronoZonedDateTime
. Vedi docs.oracle.com/javase/8/docs/api/java/time/chrono/…
Questo funziona per me:
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--
Soluzione di Kotlin:
1) Incolla questa funzione di estensione da qualche parte.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) Usalo e non usarlo mai più.
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());
}
Semplice
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());