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
, และCalendar
SimpleDateFormat
โครงการ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.Date
java.sql.Date