TL; DR
วิธีการแปลง java.util.Date เป็น java.sql.Date?
อย่า ทั้งสองคลาสนั้นล้าสมัย
- ใช้คลาสjava.timeแทนแบบดั้งเดิม
java.util.Date
& java.sql.Date
กับ JDBC 4.2 หรือใหม่กว่า
- แปลงเป็น / จาก java.time หากการปฏิบัติการระหว่างกันกับรหัสยังไม่ได้รับการอัพเดตเป็น java.time
PreparedStatement
ตัวอย่างแบบสอบถาม
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
เปลี่ยน:
Instant
แทนที่จะเป็นjava.util.Date
ทั้งสองแทนช่วงเวลาใน UTC แต่ตอนนี้มีนาโนวินาทีแทนที่จะเป็นมิลลิวินาที
LocalDate
แทนที่จะเป็นjava.sql.Date
ทั้งสองแทนค่าวันที่เท่านั้นโดยไม่มีเวลาของวันและไม่มีเขตเวลา
รายละเอียด
ถ้าคุณกำลังพยายามที่จะทำงานร่วมกับค่าวันเท่านั้น (ไม่มีเวลาของวันไม่มีโซนเวลา) ให้ใช้ระดับมากกว่าLocalDate
java.util.Date
java.time
ใน Java 8 และต่อมาลำบากเก่าชั้นเรียนวันที่เวลาที่มาพร้อมกับรุ่นแรกของ Java ได้รับการแทนที่ด้วยใหม่แพคเกจ java.time ดูออราเคิลกวดวิชา ฟังก์ชั่นส่วนใหญ่ได้รับการแบ็คอัพไปยัง Java 6 และ 7 ในThreeTen-Backportและปรับใช้กับ Android ในThreeTenABPเพิ่มเติม
ชนิดข้อมูล SQL DATE
มีขึ้นเพื่อเป็นวันเดียวกับไม่มีเวลาของวันและโซนเวลาไม่นาน Java ไม่เคยมีคลาสดังกล่าวอย่างแม่นยำ precisely จนกระทั่งjava.time.LocalDate
ใน Java 8 เรามาสร้างคุณค่าโดยรับวันที่วันนี้ตามเขตเวลาเฉพาะ (เขตเวลามีความสำคัญในการกำหนดวันที่เป็นรุ่งอรุณของวันใหม่ในปารีสกว่าMontréalสำหรับ ตัวอย่าง).
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
ณ จุดนี้เราอาจจะทำ หากไดรเวอร์ JDBCของคุณเป็นไปตามข้อกำหนดJDBC 4.2คุณควรจะสามารถส่งLocalDate
ผ่านsetObject
บนPreparedStatement
เพื่อเก็บลงในฟิลด์ SQL DATE
myPreparedStatement.setObject( 1 , localDate );
เช่นเดียวกันใช้ResultSet::getObject
เพื่อดึงข้อมูลจากคอลัมน์ SQL DATE ไปยังLocalDate
วัตถุJava ระบุระดับในการโต้เถียงที่สองทำให้รหัสของคุณชนิดปลอดภัย
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
ในคำอื่น ๆคำถามทั้งหมดนี้ไม่เกี่ยวข้องภายใต้ JDBC 4.2หรือในภายหลัง
หากไดรเวอร์ JDBC ของคุณไม่ทำงานในลักษณะนี้คุณต้องถอยกลับไปที่การแปลงเป็นประเภท java.sql
แปลงเป็น java.sql.Date
ในการแปลงให้ใช้วิธีการใหม่ที่เพิ่มเข้ามาในคลาสวันที่เก่า เราสามารถเรียกการแปลงjava.sql.Date.valueOf(…)
LocalDate
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
และไปในทิศทางอื่น
LocalDate localDate = sqlDate.toLocalDate();
แปลงจาก java.util.Date
แม้ว่าคุณควรหลีกเลี่ยงการใช้คลาสวันที่เก่า แต่คุณอาจถูกบังคับให้ทำงานกับรหัสที่มีอยู่ ถ้าเป็นเช่นนั้นคุณสามารถแปลงเป็น / จาก java.time
ผ่านInstant
ชั้นเรียนซึ่งแสดงถึงช่วงเวลาในเส้นเวลาใน UTC จะคล้ายกันในความคิดไปInstant
java.util.Date
แต่โปรดทราบว่าInstant
มีความละเอียดสูงถึงนาโนวินาทีในขณะที่java.util.Date
มีเพียงมิลลิวินาทีเท่านั้นความละเอียดเป็น
ในการแปลงให้ใช้วิธีการใหม่ที่เพิ่มในคลาสเก่า ยกตัวอย่างเช่นและjava.util.Date.from( Instant )
java.util.Date::toInstant
Instant instant = myUtilDate.toInstant();
ในการกำหนดวันที่เราต้องการบริบทของเขตเวลา สำหรับช่วงเวลาใด ๆ วันที่จะแตกต่างกันไปทั่วโลกตามโซนเวลา ใช้ a ZoneId
เพื่อรับ a ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
java คลาส java.sql วันที่อ้างว่าเป็นวันที่เท่านั้นโดยไม่มีเวลาของวัน แต่จริง ๆ แล้วทำเวลาของวันปรับเป็นเวลาเที่ยงคืน ทำให้เกิดความสับสน? ใช่คลาสวันที่แบบเก่านั้นไม่เป็นระเบียบ
เกี่ยวกับjava.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, Calendar
และSimpleDateFormat
และ
Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยัง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
และอื่น ๆ อีกมากมาย