Я хочу преобразовать 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, который вы можете использовать для создания объектов Instant из большинства классов времени. Мгновенный представляет миллисекунды на временной шкале в эпоху - базовую ссылку для всех других дат и времени.
Нам нужно преобразовать дату в 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());