TL; DR
โครงการJoda-Timeอยู่ในโหมดการบำรุงรักษาตอนนี้แทนที่ด้วยคลาสjava.time
- เพียงแค่ใช้
java.time.Instant
คลาส
- ไม่จำเป็นต้อง:
LocalDateTime
java.sql.Timestamp
- เงื่อนไข
จับภาพช่วงเวลาปัจจุบันใน UTC
Instant.now()
ในการจัดเก็บช่วงเวลานั้นในฐานข้อมูล:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
ในการดึงช่วงเวลานั้นจากฐานข้อมูล:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
เพื่อปรับเวลานาฬิกาแขวนให้เป็นเขตเวลาเฉพาะ
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
เป็นชั้นที่ผิด
คำตอบอื่น ๆ ถูกต้อง แต่ไม่สามารถชี้ได้ว่าLocalDateTime
เป็นชั้นเรียนที่ไม่ถูกต้องสำหรับจุดประสงค์ของคุณ
ทั้งในjava.timeและJoda-TimeมีLocalDateTime
เจตนาที่จะขาดแนวคิดเรื่องเขตเวลาหรือ offset-from-UTC ด้วยเหตุนี้จึงไม่ได้แสดงถึงช่วงเวลาหนึ่งและไม่ใช่จุดบนไทม์ไลน์ A LocalDateTime
แสดงถึงแนวคิดคร่าวๆเกี่ยวกับศักยภาพช่วงเวลาที่ในช่วงประมาณ 26-27 ชั่วโมง
ใช้LocalDateTime
สำหรับอย่างใดอย่างหนึ่งเมื่อไม่ทราบโซน / ออฟเซ็ต (ไม่ใช่สถานการณ์ที่ดี) หรือเมื่อไม่ทราบแน่ชัด ตัวอย่างเช่น“ คริสต์มาสเริ่มต้นในช่วงเวลาแรกของวันที่ 25 ธันวาคม 2018” จะแสดงเป็นLocalDateTime
จะแสดงเป็น
ใช้ZonedDateTime
เพื่อแสดงช่วงเวลาในเขตเวลาหนึ่ง ๆ ตัวอย่างเช่นคริสต์มาสเริ่มต้นในโซนใดโซนหนึ่งเช่นPacific/Auckland
หรือAmerica/Montreal
จะแสดงด้วยZonedDateTime
วัตถุ
สำหรับช่วงเวลาที่เสมอในเวลา UTC Instant
ใช้
Instant instant = Instant.now() ; // Capture the current moment in UTC.
ใช้เขตเวลา ช่วงเวลาเดียวกันจุดเดียวกันบนไทม์ไลน์ แต่ดูด้วยเวลานาฬิกาแขวนที่ต่างกัน
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
ดังนั้นถ้าฉันสามารถแปลงระหว่าง LocalDate และ LocalDateTime ได้
ไม่ผิดกลยุทธ์ หากคุณมีค่าวันที่เท่านั้นและคุณต้องการค่าวันที่ - เวลาคุณต้องระบุเวลาของวัน เวลาของวันนั้นอาจใช้ไม่ได้ในวันนั้นสำหรับโซนใดโซนหนึ่งซึ่งในกรณีนี้ZonedDateTime
คลาสจะปรับเวลาโดยอัตโนมัติตามความจำเป็น
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
หากคุณต้องการให้ช่วงเวลาแรกของวันเป็นช่วงเวลาของวันให้java.timeกำหนดช่วงเวลานั้น อย่าถือว่าวันเริ่มเวลา 00:00:00 น. ความผิดปกติเช่นเวลาออมแสง (DST) หมายถึงวันอาจเริ่มต้นในเวลาอื่นเช่น 01:00:00 น.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
เป็นชั้นที่ผิด
java.sql.Timestamp
เป็นส่วนหนึ่งของการเรียนลำบากเก่าวันที่เวลาว่าตอนนี้เป็นมรดกแทนที่ทั้งหมดโดยjava.timeชั้นเรียน ว่าชั้นถูกนำมาใช้เพื่อเป็นตัวแทนของช่วงเวลาในUTCมีความละเอียดของนาโนวินาที java.time.Instant
วัตถุประสงค์ที่จะให้บริการในขณะนี้ด้วย
JDBC 4.2 พร้อมgetObject
/setObject
ตั้งแต่JDBC 4.2และใหม่กว่าไดรเวอร์ JDBCของคุณสามารถแลกเปลี่ยนวัตถุ java.time กับฐานข้อมูลได้โดยตรงโดยการเรียก:
ตัวอย่างเช่น:
myPreparedStatement.setObject( … , instant ) ;
…และ…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
แปลงมรดก⬌ทันสมัย
หากคุณต้องเชื่อมต่อกับโค้ดเก่าที่ยังไม่ได้อัปเดตเป็นjava.timeให้แปลงกลับไปกลับมาโดยใช้วิธีการใหม่ที่เพิ่มในคลาสเก่า
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…และ…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
เกี่ยวกับ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 ได้ที่ไหน?
- Java SE 8 , Java SE 9และใหม่กว่า
- Built-in
- ส่วนหนึ่งของ Java API มาตรฐานพร้อมการใช้งานแบบรวม
- Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
- Java SE 6และ Java SE 7
- มากของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
- Android
- การใช้งานกลุ่ม Android เวอร์ชันที่ใหม่กว่าของคลาส java.time
- สำหรับก่อนหน้านี้ Android (<26) ที่ThreeTenABPโครงการปรับThreeTen-ย้ายกลับ (ดังกล่าวข้างต้น) ดูวิธีใช้ ThreeTenABP … .
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย
java.sql.Timestamp
ระดับคือตอนนี้มรดกแทนที่ด้วยjava.timeInstant
เรียนโดยเฉพาะ