Voglio convertire java.time.LocalDatein java.util.Datetipo. Perché voglio impostare la data in JDateChooser. O c'è un selettore di date che supporta le java.timedate?
Voglio convertire java.time.LocalDatein java.util.Datetipo. Perché voglio impostare la data in JDateChooser. O c'è un selettore di date che supporta le java.timedate?
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.timeclassi più recenti in java.util.Dateoggetti 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.Datecon il suo tempo impostato, 00:00:00ma il punto di vista progettuale è che java.sql.*non è pensato per un livello frontale con cui i clienti interagiscono come Servlet / JSP. java.util.Datenel lato Java java.sql.Timestampeo 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());