Chcę przekonwertować java.time.LocalDate
na java.util.Date
typ. Ponieważ chcę ustawić datę na JDateChooser
. A może jest jakiś wybór daty, który obsługuje java.time
daty?
Chcę przekonwertować java.time.LocalDate
na java.util.Date
typ. Ponieważ chcę ustawić datę na JDateChooser
. A może jest jakiś wybór daty, który obsługuje java.time
daty?
Odpowiedzi:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Zakłada się, że wybieracz dat używa domyślnej systemowej strefy czasowej do przekształcania dat w ciągi znaków.
atStartOfDay()
, ponieważ zmienia wartość daty, tak jak ją rozumiem.
Oto klasa narzędziowa, której używam do konwertowania nowszych java.time
klas na java.util.Date
obiekty i odwrotnie:
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();
}
}
Edytowane na podstawie komentarza @Oliv.
ZoneId.systemDefault()
problematyczne, ponieważ strefy czasowe zmieniają się w ciągu roku. Więc jeśli w dniu 01 stycznia będę w strefie czasowej -05: 00 (centralnie), ale następnie w dniu 1 lipca będę w strefie czasowej -06: 00 (centralne światło dzienne), czy nie spowoduje to niedokładnych wyników z powodu oszczędności w świetle dziennym czas?
Możesz użyć java.sql.Date.valueOf()
metody jako:
Date date = java.sql.Date.valueOf(localDate);
Nie musisz tutaj dodawać informacji o czasie i strefie czasowej, ponieważ są one pobierane niejawnie.
Zobacz LocalDate na java.util.Date i odwrotnie, najprostsza konwersja?
java.sql.Date
jest przeznaczony dla warstwy bazy danych, JDBC, JPA. Warstwa internetowa (lub dowolna aplikacja kliencka) powinna być absolutnie wolna od jakichkolwiek zależności java.sql.*
.
java.sql.Date
jest po prostu java.util.Date
ustawiony na czas, 00:00:00
ale punkt widzenia w perspektywie projektowej jest taki, że java.sql.*
nie jest on przeznaczony dla przedniej warstwy, z którą klienci wchodzą w interakcje, jak serwlety / JSP. java.util.Date
po stronie Java i / java.sql.Timestamp
lub cokolwiek ma zastosowanie java.sql.*
po stronie JDBC .
java.sql.*
klasy będą osobną zależnością.
java.time ma interfejs Temporal, którego można używać do tworzenia obiektów Instant z większości klas czasu. Natychmiastowa reprezentuje milisekundy na osi czasu w Epoce - podstawowe odniesienie dla wszystkich innych dat i godzin.
Musimy przekonwertować datę na ZonedDateTime, z czasem i strefą, aby wykonać konwersję:
LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Aby utworzyć java.util.Date z java.time.LocalDate , musisz
Kod może wyglądać następująco:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
jest dziedziczona java.time.chrono.ChronoZonedDateTime
. Zobacz docs.oracle.com/javase/8/docs/api/java/time/chrono/…
To działa dla mnie:
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--
Rozwiązanie Kotlin:
1) Wklej gdzieś tę funkcję rozszerzenia.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) Użyj go i nigdy więcej google.
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());
}
Prosty
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());