Я хочу перетворити java.time.LocalDate
на java.util.Date
тип. Тому що я хочу встановити дату JDateChooser
. Або є якийсь вибір дати, який підтримує java.time
дати?
Я хочу перетворити java.time.LocalDate
на java.util.Date
тип. Тому що я хочу встановити дату JDateChooser
. Або є якийсь вибір дати, який підтримує java.time
дати?
Відповіді:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Це передбачає, що вибраний вами дат використовує часовий пояс системи за замовчуванням для перетворення дат у рядки.
atStartOfDay()
, оскільки це змінює значення дати, наскільки я це розумію.
Ось клас корисності, який я використовую для перетворення нових java.time
класів в java.util.Date
об'єкти і навпаки:
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();
}
}
Відредаговано на основі коментаря @Oliv.
ZoneId.systemDefault()
проблематично, оскільки часові пояси змінюються протягом року. Тож якщо 01 січня я перебуваю у часовому поясі -05: 00 (центральний), але тоді 01 липня я перебуваю у часовому поясі -06: 00 (центральне денне світло), це не призведе до неточних результатів через економію денного світла час?
Ви можете використовувати java.sql.Date.valueOf()
метод як:
Date date = java.sql.Date.valueOf(localDate);
Тут не потрібно додавати інформацію про час та часовий пояс, оскільки вони приймаються неявно.
Дивіться LocalDate в java.util.Date і навпаки найпростіша конверсія?
java.sql.Date
призначений для рівня баз даних, JDBC, JPA. Веб-шар (або будь-яка клієнтська програма) повинен абсолютно не бути залежним від java.sql.*
.
java.sql.Date
Справедливий java.util.Date
час, 00:00:00
але в дизайнерській перспективі справа java.sql.*
не в тому, що призначений для переднього шару, з яким взаємодіють клієнти, як Servlets / JSP. java.util.Date
на стороні Java та java.sql.Timestamp
або що інше застосовується з java.sql.*
боку JDBC .
java.sql.*
класи будуть окремою залежністю.
java.time має інтерфейс Temporal, який можна використовувати для створення миттєвих об’єктів з більшості класів часу. Миттєвий сигнал відображає мілісекунди на часовій шкалі в Епоху - базовій посиланні для всіх інших дат і часу.
Нам потрібно перетворити дату в ZonedDateTime, з часом і зоною, щоб здійснити перетворення:
LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Щоб створити java.util.Date з java.time.LocalDate , ви повинні
Код може виглядати наступним чином:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
успадкований від java.time.chrono.ChronoZonedDateTime
. Дивіться docs.oracle.com/javase/8/docs/api/java/time/chrono/…
Це працює для мене:
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--
Рішення Котліна:
1) Вставити цю функцію розширення кудись.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) Використовуйте його, і ніколи більше не гуглите це.
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());
}
Простий
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());