tl; dr
java.util.Date.from(
Instant.now() ;
)
แม้ว่าจะไม่มีจุดใดในรหัสข้างต้น ทั้งสองjava.util.DateและInstantแสดงช่วงเวลาใน UTC เสมอใน UTC รหัสด้านบนมีผลเช่นเดียวกับ:
new java.util.Date()
ZonedDateTimeไม่มีประโยชน์ที่นี่เพื่อใช้ หากคุณมีอยู่แล้วให้ZonedDateTimeปรับเป็น UTC โดยแยกไฟล์Instant.
java.util.Date.from(
myZonedDateTime.toInstant()
)
คำตอบอื่น ๆ ถูกต้อง
คำตอบโดยssoltanidอย่างถูกต้องอยู่คำถามของคุณโดยเฉพาะวิธีการแปลง java.time วัตถุใหม่โรงเรียน ( ZonedDateTime) เพื่อโรงเรียนเก่าjava.util.Dateวัตถุ แยกInstantจาก ZonedDateTime java.util.Date.from()และส่งผ่านไปยัง
ข้อมูลสูญหาย
โปรดทราบว่าคุณจะต้องสูญเสียข้อมูลเนื่องจากInstantติดตามนาโนวินาทีตั้งแต่ยุคขณะที่java.util.Dateติดตามมิลลิวินาทีนับตั้งแต่ยุค

คำถามและความคิดเห็นของคุณทำให้เกิดปัญหาอื่น ๆ
เก็บเซิร์ฟเวอร์ใน UTC
เซิร์ฟเวอร์ของคุณควรตั้งค่าโฮสต์ OS เป็น UTC เป็นแนวปฏิบัติที่ดีที่สุดโดยทั่วไป JVM รับการตั้งค่าโฮสต์ OS นี้เป็นโซนเวลาเริ่มต้นในการใช้งาน Java ที่ฉันทราบ
ระบุโซนเวลา
แต่คุณไม่ควรพึ่งพาเขตเวลาเริ่มต้นปัจจุบันของ JVM แทนที่จะรับการตั้งค่าโฮสต์แฟล็กที่ส่งผ่านเมื่อเรียกใช้ JVM สามารถตั้งค่าเขตเวลาอื่น ที่แย่ไปกว่านั้น: โค้ดใด ๆ ในเธรดของแอพใดก็ได้ตลอดเวลาสามารถโทรjava.util.TimeZone::setDefaultเพื่อเปลี่ยนค่าเริ่มต้นที่รันไทม์ได้!
Timestampประเภทคาสซานดรา
ใด ๆฐานข้อมูลที่ดีและคนขับรถโดยอัตโนมัติควรจะจัดการกับการปรับผ่านวันเวลาที่จะ UTC สำหรับการจัดเก็บ ฉันไม่ได้ใช้ Cassandra แต่ดูเหมือนว่าจะมีการรองรับพื้นฐานสำหรับวันที่ - เวลา เอกสารระบุว่าTimestampประเภทของมันคือจำนวนมิลลิวินาทีจากยุคเดียวกัน (ช่วงเวลาแรกของปี 1970 ใน UTC)
ISO 8601
นอกจากนี้ Cassandra ยังยอมรับอินพุตสตริงในรูปแบบมาตรฐานISO 8601 โชคดีที่ java.time ใช้รูปแบบ ISO 8601 เป็นค่าเริ่มต้นสำหรับการแยกวิเคราะห์ / สร้างสตริง การใช้งานInstantชั้นเรียนtoStringจะทำได้ดี
ความแม่นยำ: มิลลิวินาทีเทียบกับนาโนคอร์ด
แต่ก่อนอื่นเราต้องลดความแม่นยำระดับนาโนวินาทีของ ZonedDateTime เป็นมิลลิวินาที วิธีหนึ่งคือสร้าง Instant ใหม่โดยใช้มิลลิวินาที โชคดีที่ java.time มีวิธีการที่สะดวกในการแปลงค่าเป็นมิลลิวินาที
ตัวอย่างรหัส
นี่คือตัวอย่างโค้ดบางส่วนใน Java 8 Update 60
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
Instant instant = zdt.toInstant();
Instant instantTruncatedToMilliseconds = Instant.ofEpochMilli( instant.toEpochMilli() );
String fodderForCassandra = instantTruncatedToMilliseconds.toString();
หรือตามเอกสารไดรเวอร์ Cassandra Javaนี้คุณสามารถส่งผ่านjava.util.Dateอินสแตนซ์ (เพื่อไม่ให้สับสนกับjava.sqlDate) คุณสามารถสร้าง juDate ได้จากinstantTruncatedToMillisecondsโค้ดด้านบน
java.util.Date dateForCassandra = java.util.Date.from( instantTruncatedToMilliseconds );
หากทำเช่นนี้บ่อยๆคุณสามารถสร้างซับใน
java.util.Date dateForCassandra = java.util.Date.from( zdt.toInstant() );
แต่มันจะดีกว่าที่จะสร้างวิธียูทิลิตี้เล็กน้อย
static public java.util.Date toJavaUtilDateFromZonedDateTime ( ZonedDateTime zdt ) {
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant ) ;
return utilDate;
}
สังเกตความแตกต่างของรหัสทั้งหมดนี้มากกว่าในคำถาม รหัสของคำถามพยายามปรับโซนเวลาของอินสแตนซ์ ZonedDateTime เป็น UTC แต่นั่นไม่จำเป็น ตามแนวคิด:
ZonedDateTime = ทันที + ZoneId
เราเพียงแค่แยกส่วนทันทีซึ่งมีอยู่แล้วใน UTC (โดยทั่วไปใน UTC อ่านเอกสารคลาสเพื่อดูรายละเอียดที่แม่นยำ)

เกี่ยวกับjava.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, และCalendarSimpleDateFormat
โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปยังคลาสjava.time
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องมีสตริงไม่จำเป็นต้องมีjava.sql.*คลาส
จะหาคลาส java.time ได้ที่ไหน?

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย
java.util.Datejava.sql.Date