Trong Java 8, làm cách nào tôi có thể chuyển đổi một Timestamp
(trong java.sql
) thành một LocalDate
(trong java.time
)?
Trong Java 8, làm cách nào tôi có thể chuyển đổi một Timestamp
(trong java.sql
) thành một LocalDate
(trong java.time
)?
Câu trả lời:
Bạn có thể làm:
timeStamp.toLocalDateTime().toLocalDate();
Lưu ý rằng
timestamp.toLocalDateTime()
sẽ sử dụngClock.systemDefaultZone()
múi giờ để thực hiện chuyển đổi. Điều này có thể hoặc không thể là những gì bạn muốn.
timestamp.toLocalDateTime()
phương thức sẽ sử dụng múi giờ systemDefault để thực hiện chuyển đổi. Điều này có thể hoặc không thể là những gì bạn muốn.
LocalDateTime
luôn sử dụng múi giờ mặc định của hệ thống. Đó là "Địa phương" nghĩa là gì trong tên của nó.
Câu trả lời được chấp nhận là không lý tưởng, vì vậy tôi quyết định thêm 2 xu của mình
timeStamp.toLocalDateTime().toLocalDate();
nói chung là một giải pháp tồi , tôi thậm chí không chắc tại sao họ lại thêm phương thức này vào JDK vì nó khiến mọi thứ thực sự khó hiểu bằng cách thực hiện chuyển đổi ngầm bằng múi giờ hệ thống. Thông thường khi chỉ sử dụng các lớp ngày java8, lập trình viên buộc phải chỉ định múi giờ là một điều tốt.
Giải pháp tốt là
timestamp.toInstant().atZone(zoneId).toLocalDate()
Trong đó ZoneId là múi giờ bạn muốn sử dụng, thường là ZoneId.systemDefault () nếu bạn muốn sử dụng múi giờ hệ thống của mình hoặc một số múi giờ được mã hóa cứng như Zone Offerset.UTC
Cách tiếp cận chung nên là
Tôi sẽ mở rộng câu trả lời @assylias để tính đến múi giờ. Có ít nhất hai cách để lấy LocalDateTime cho múi giờ cụ thể.
Bạn có thể sử dụng múi giờ setDefault cho toàn bộ ứng dụng. Nó nên được gọi trước bất kỳ dấu thời gian nào -> java.time convert:
public static void main(String... args) {
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(utcTimeZone);
...
timestamp.toLocalDateTime().toLocalDate();
}
Hoặc bạn có thể sử dụng chuỗi toInstant.atZone:
timestamp.toInstant()
.atZone(ZoneId.of("UTC"))
.toLocalDate();