คำตอบสั้น ๆ :
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
คำอธิบาย: (ตามคำถามนี้เกี่ยวกับLocalDate
)
แม้จะมีชื่อjava.util.Date
แสดงถึงการโต้ตอบแบบทันทีในเส้นเวลาไม่ใช่ "วันที่" ข้อมูลจริงที่จัดเก็บภายในวัตถุนั้นlong
นับเป็นมิลลิวินาทีตั้งแต่ 1970-01-01T00: 00Z (เที่ยงคืนเมื่อเริ่มต้น 1970 GMT / UTC)
คลาสที่เทียบเท่ากับjava.util.Date
ใน JSR-310 Instant
จึงมีวิธีที่สะดวกในการจัดเตรียมการแปลงไปมา
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
java.util.Date
เช่นมีแนวคิดของโซนเวลาไม่มี นี่อาจดูแปลกถ้าคุณโทรหาtoString()
a java.util.Date
เพราะtoString
มันสัมพันธ์กับเขตเวลา อย่างไรก็ตามวิธีการนั้นใช้เขตเวลาเริ่มต้นของ Java ในการบินเพื่อจัดเตรียมสตริง java.util.Date
The-โซนเวลาไม่ได้เป็นส่วนหนึ่งของรัฐที่แท้จริงของ
Instant
ยังไม่ได้มีข้อมูลใด ๆ เกี่ยวกับโซนเวลา ดังนั้นการแปลงจากการInstant
เป็นวันที่เวลาท้องถิ่นมีความจำเป็นต้องระบุเขตเวลา นี่อาจเป็นเขตเริ่มต้น - ZoneId.systemDefault()
- หรืออาจเป็นเขตเวลาที่แอปพลิเคชันของคุณควบคุมเช่นเขตเวลาจากการตั้งค่าของผู้ใช้ LocalDateTime
มีวิธีการที่สะดวกจากโรงงานซึ่งใช้ทั้งโซนเวลาและโซนเวลา:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
ในทางกลับกันเขตLocalDateTime
เวลาจะถูกระบุโดยเรียกatZone(ZoneId)
วิธีการ ZonedDateTime
แล้วสามารถแปลงโดยตรงไปยังInstant
:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
โปรดทราบว่าการแปลงจากLocalDateTime
ถึงZonedDateTime
มีแนวโน้มที่จะนำเสนอพฤติกรรมที่ไม่คาดคิด นี่เป็นเพราะไม่มีวันที่เวลาท้องถิ่นเนื่องจากการปรับเวลาตามฤดูกาล ในฤดูใบไม้ร่วง / ฤดูใบไม้ร่วงจะมีการทับซ้อนกันในเส้นบอกเวลาท้องถิ่นซึ่งมีวันที่และเวลาท้องถิ่นซ้ำกันสองครั้ง ในฤดูใบไม้ผลิมีช่องว่างซึ่งเวลาหนึ่งชั่วโมงจะหายไป ดู Javadoc ของatZone(ZoneId)
สำหรับคำนิยามเพิ่มเติมของการแปลงที่จะทำ
สรุปถ้าคุณjava.util.Date
ไป a LocalDateTime
และกลับไป a java.util.Date
คุณอาจจบลงด้วยการเปลี่ยนทันทีเนื่องจากเวลาออมแสง
ข้อมูลเพิ่มเติม: มีความแตกต่างอื่นที่จะส่งผลต่อวันที่เก่ามาก java.util.Date
ใช้ปฏิทินที่เปลี่ยนแปลงเมื่อวันที่ 15 ตุลาคม 1582 โดยมีวันที่ก่อนหน้านั้นโดยใช้ปฏิทินจูเลียนแทนที่จะเป็นปฏิทินเกรกอเรียน ในทางตรงกันข้ามjava.time.*
ใช้ระบบปฏิทิน ISO (เทียบเท่ากับ Gregorian) ตลอดเวลา ในกรณีที่ใช้มากที่สุดระบบปฏิทิน ISO เป็นสิ่งที่คุณต้องการ แต่คุณอาจเห็นผลกระทบแปลก ๆ เมื่อเปรียบเทียบวันที่ก่อนปี 1582