Tôi muốn chuyển đổi java.time.LocalDate
thành java.util.Date
loại. Bởi vì tôi muốn đặt ngày vào JDateChooser
. Hoặc có bất kỳ trình chọn java.time
ngày hỗ trợ ngày?
Tôi muốn chuyển đổi java.time.LocalDate
thành java.util.Date
loại. Bởi vì tôi muốn đặt ngày vào JDateChooser
. Hoặc có bất kỳ trình chọn java.time
ngày hỗ trợ ngày?
Câu trả lời:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Giả sử trình chọn ngày của bạn sử dụng múi giờ mặc định của hệ thống để chuyển đổi ngày thành chuỗi.
atStartOfDay()
, vì nó thay đổi giá trị của ngày, như tôi hiểu.
Đây là một lớp tiện ích tôi sử dụng để chuyển đổi các java.time
lớp mới hơn thành java.util.Date
các đối tượng và ngược lại:
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();
}
}
Được chỉnh sửa dựa trên bình luận @Oliv.
ZoneId.systemDefault()
có vấn đề vì múi giờ thay đổi so với năm ngoái. Vì vậy, nếu vào ngày 01 tháng 1, tôi ở múi giờ -05: 00 (trung tâm), nhưng vào ngày 01 tháng 7, tôi ở múi giờ -06: 00 (ánh sáng ban ngày trung tâm) sẽ không gây ra kết quả không chính xác vì tiết kiệm ánh sáng ban ngày thời gian?
Bạn có thể sử dụng java.sql.Date.valueOf()
phương pháp như:
Date date = java.sql.Date.valueOf(localDate);
Không cần thêm thông tin múi giờ và múi giờ ở đây vì chúng được thực hiện ngầm.
Xem LocalDate sang java.util.Date và ngược lại chuyển đổi đơn giản nhất?
java.sql.Date
có nghĩa là cho lớp cơ sở dữ liệu, JDBC, JPA. Lớp web (hoặc bất kỳ ứng dụng khách nào) hoàn toàn không có bất kỳ sự phụ thuộc nào java.sql.*
.
java.sql.Date
chỉ java.util.Date
với thời gian được đặt thành 00:00:00
nhưng điểm trong phối cảnh thiết kế java.sql.*
là không dành cho lớp trước mà các máy khách tương tác với nhau như Servlets / JSP. java.util.Date
trong phía Java và java.sql.Timestamp
hoặc bất cứ điều gì có thể áp dụng từ java.sql.*
phía JDBC .
java.sql.*
lớp sẽ là một phụ thuộc riêng.
java.time có giao diện Temporal mà bạn có thể sử dụng để tạo các đối tượng Instant từ hầu hết các lớp thời gian. Instant biểu thị mili giây trên dòng thời gian trong Epoch - tham chiếu cơ bản cho tất cả các ngày và thời gian khác.
Chúng tôi cần chuyển đổi Ngày thành ZiatedDateTime, với Thời gian và Vùng, để thực hiện chuyển đổi:
LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Để tạo java.util.Date từ java.time.LocalDate , bạn phải
Mã có thể trông như sau:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
được kế thừa từ java.time.chrono.ChronoZonedDateTime
. Xem docs.oracle.com/javase/8/docs/api/java/time/ synco / Giả
Điều này làm việc cho tôi:
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--
Giải pháp của Kotlin:
1) Dán chức năng mở rộng này ở đâu đó.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) Sử dụng nó, và không bao giờ google cái này một lần nữa.
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());
}
Đơn giản
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());