ใน Java 8 ฉันจะแปลง a Timestamp
(in java.sql
) เป็น a LocalDate
(in java.time
) ได้อย่างไร?
ใน Java 8 ฉันจะแปลง a Timestamp
(in java.sql
) เป็น a LocalDate
(in java.time
) ได้อย่างไร?
คำตอบ:
คุณทำได้:
timeStamp.toLocalDateTime().toLocalDate();
โปรดทราบว่า
timestamp.toLocalDateTime()
จะใช้Clock.systemDefaultZone()
เขตเวลาในการแปลง สิ่งนี้อาจใช่หรือไม่ใช่สิ่งที่คุณต้องการ
timestamp.toLocalDateTime()
เมธอดจะใช้โซนเวลา systemDefault เพื่อทำการแปลง สิ่งนี้อาจใช่หรือไม่ใช่สิ่งที่คุณต้องการ
LocalDateTime
ใช้เขตเวลาเริ่มต้นของระบบเสมอ นั่นคือความหมายของ "Local" ในชื่อ
คำตอบที่ยอมรับนั้นไม่เหมาะอย่างยิ่งดังนั้นฉันจึงตัดสินใจเพิ่ม 2 เซ็นต์
timeStamp.toLocalDateTime().toLocalDate();
เป็นวิธีแก้ปัญหาที่ไม่ดีโดยทั่วไปฉันไม่แน่ใจด้วยซ้ำว่าทำไมพวกเขาถึงเพิ่มวิธีนี้ใน JDK เพราะมันทำให้สิ่งต่าง ๆ สับสนจริงๆโดยทำการแปลงโดยปริยายโดยใช้เขตเวลาของระบบ โดยปกติเมื่อใช้เฉพาะคลาสวันที่ java8 โปรแกรมเมอร์จะถูกบังคับให้ระบุเขตเวลาซึ่งเป็นสิ่งที่ดี
ทางออกที่ดีคือ
timestamp.toInstant().atZone(zoneId).toLocalDate()
โดยzoneIdคือเขตเวลาที่คุณต้องการใช้ซึ่งโดยทั่วไปจะเป็นZoneId.systemDefault ()หากคุณต้องการใช้เขตเวลาระบบของคุณหรือเขตเวลาที่เข้ารหัสเช่นZoneOffset.UTC
แนวทางทั่วไปควรเป็น
ฉันจะขยายคำตอบของ @assylias เล็กน้อยเพื่อพิจารณาเขตเวลา มีอย่างน้อยสองวิธีในการรับ LocalDateTime สำหรับเขตเวลาเฉพาะ
คุณสามารถใช้โซนเวลา setDefault สำหรับแอปพลิเคชันทั้งหมด ควรเรียกก่อนการประทับเวลาใด ๆ -> การแปลง java.time:
public static void main(String... args) {
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(utcTimeZone);
...
timestamp.toLocalDateTime().toLocalDate();
}
หรือคุณสามารถใช้ toInstant.atZone chain:
timestamp.toInstant()
.atZone(ZoneId.of("UTC"))
.toLocalDate();