จะแปลง LocalDate เป็น Instant ได้อย่างไร?


106

ฉันทำงานกับ DateTime API ใหม่ของ Java 8

จะแปลง LocalDate เป็น Instant ได้อย่างไร? ฉันได้รับข้อยกเว้นด้วย

LocalDate date = LocalDate.of(2012, 2, 2);
Instant instant = Instant.from(date);

และฉันไม่เข้าใจว่าทำไม


เพราะLocalDateไม่รวมเวลา
OrangeDog

คำตอบ:


100

Instantชั้นแสดงให้เห็นถึงจุดทันทีที่เวลาสาย การแปลงเป็นและจากLocalDateต้องใช้เขตเวลา ไม่เหมือนกับไลบรารีวันที่และเวลาอื่น ๆ JSR-310 จะไม่เลือกเขตเวลาให้คุณโดยอัตโนมัติดังนั้นคุณต้องระบุ

LocalDate date = LocalDate.now();
Instant instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant();

ตัวอย่างนี้ใช้เขตเวลาเริ่มต้นของ JVM - ZoneId.systemDefault()- เพื่อทำการแปลง ดูคำตอบที่ยาวขึ้นสำหรับคำถามที่เกี่ยวข้องได้ที่นี่


ปรับปรุง: ได้รับการยอมรับการใช้คำตอบที่จะยอมรับเฉพาะLocalDateTime::toInstant(ZoneOffset) ZoneOffsetคำตอบนี้การใช้งานที่รับใด ๆLocalDate::atStartOfDay(ZoneId) ZoneIdด้วยเหตุนี้คำตอบนี้จึงมีประโยชน์มากกว่า (และน่าจะเป็นคำตอบที่ยอมรับได้)

ปล. ฉันเป็นผู้เขียนหลักของ API


1
ฉันคิดว่านี่เป็นประโยชน์มากกว่าคำตอบที่ยอมรับเนื่องจาก ZoneId (เขตเวลา) เป็นพารามิเตอร์ไม่ใช่ ZoneOffset (ชั่วโมงเปลี่ยนจาก UTC ซึ่งอาจเปลี่ยนแปลงสำหรับเขตเวลาในฤดูร้อน / ฤดูหนาว)
wuerg

1
ในการทดสอบหน่วยฉันกำลังเขียนฉันมี LocalDate ซึ่งจะถูกแปลงเป็น com.google.protobuf.Timestamp แล้วแมปกลับไปที่ LocalDate ผ่านทาง Instant ทั้งสองวิธี เมื่อใช้แนวทางที่คำตอบที่ยอมรับแนะนำฉันจะได้รับ LocalDate ที่คาดหวังกลับมา แต่การใช้วิธีนี้ทำให้ฉันกลับมาเป็น "วันวาน" แทนที่จะเป็น "วันนี้" เขตเวลาของฉันคือ GMT + 1
Nadrendion

128

ในการแปลงเป็นแบบทันทีคุณต้องมีอินสแตนซ์ LocalDateTime เช่น:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)

ขอบคุณมาก. ตอนนี้ฉันเข้าใจแล้วว่าฉันต้องระบุเขตเวลาเพื่อรับการค้นหาทันใจ
user1643352
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.