TL; DR
ใช้คลาสjava.time ที่ทันสมัยเท่านั้น ไม่เคยใช้เรียนมรดกที่น่ากลัวเช่นSimpleDateFormat
, หรือDate
java.sql.Timestamp
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
หรือใช้เขตเวลาเริ่มต้นปัจจุบันของJVM
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time & JDBC 4.2
วิธีการที่ทันสมัยใช้คลาสjava.timeตามที่เห็นด้านบน
หากไดรเวอร์ JDBCของคุณสอดคล้องกับJDBC 4.2คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูล การใช้งานและPreparedStatement::setObject
ResultSet::getObject
ใช้ java.sql สำหรับไดรเวอร์ก่อน JDBC 4.2 เท่านั้น
หากไดรเวอร์ JDBC ของคุณยังไม่สอดคล้องกับ JDBC 4.2 สำหรับการสนับสนุนประเภทjava.timeคุณต้องถอยกลับไปใช้คลาส java.sql
กำลังจัดเก็บข้อมูล
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
กำลังดึงข้อมูล
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ประเภท java.sql เช่นjava.sql.Timestamp
ควรใช้สำหรับการถ่ายโอนเข้าและออกจากฐานข้อมูลเท่านั้น แปลงเป็นประเภท java.time ทันทีใน Java 8 และใหม่กว่า
java.time.Instant
java.sql.Timestamp
แผนที่ไปยังjava.time.Instant
ช่วงเวลาบนไทม์ไลน์ในเวลา UTC สังเกตเห็นวิธีการแปลงใหม่ที่toInstant
เพิ่มในคลาสเก่า
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
เขตเวลา
สมัคร / โซนเวลาที่ต้องการคาดว่า ( ZoneId
) ZonedDateTime
เพื่อให้ได้
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
การจัดรูปแบบสตริง
ใช้ a DateTimeFormatter
เพื่อสร้างสตริงของคุณ รหัสรูปแบบคล้ายกับรหัสjava.text.SimpleDateFormat
แต่ไม่ตรงกันดังนั้นให้อ่านเอกสารอย่างละเอียด
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
รูปแบบเฉพาะนี้ไม่ชัดเจนว่าเป็นความหมายที่แท้จริงเนื่องจากไม่มีการระบุออฟเซ็ตจาก UTCหรือโซนเวลาใด ๆ
ISO 8601
หากคุณมีคำพูดใด ๆ ในเรื่องนี้ฉันขอแนะนำให้คุณพิจารณาใช้รูปแบบมาตรฐานISO 8601แทนที่จะใช้ตัวคุณเอง รูปแบบมาตรฐานค่อนข้างคล้ายกับของคุณ ตัวอย่างเช่น
2016-02-20T03:26:32+05:30
.
คลาส java.time ใช้รูปแบบมาตรฐานเหล่านี้เป็นค่าเริ่มต้นดังนั้นไม่จำเป็นต้องระบุรูปแบบ ZonedDateTime
ระดับขยายรูปแบบมาตรฐานโดยต่อท้ายชื่อของโซนเวลา (การปรับปรุงที่ชาญฉลาด)
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
แปลงเป็น java.sql
คุณสามารถแปลงจาก java.time java.sql.Timestamp
กลับไป สารสกัดจากInstant
ZonedDateTime
มีการเพิ่มวิธีการใหม่ในคลาสเก่าเพื่อช่วยในการแปลงเป็น / จากคลาส java.time
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
เกี่ยวกับ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
และอื่น ๆ อีกมากมาย