java.time
วิธีการที่ทันสมัยใช้คลาสjava.timeที่แทนที่คลาสวันที่และเวลาเดิมที่มีปัญหาซึ่งมาพร้อมกับ Java เวอร์ชันแรกสุด
java.sql.Timestamp
ชั้นเป็นหนึ่งในชั้นเรียนมรดกเหล่านั้น ไม่ต้องการอีกต่อไป. แทนที่จะใช้Instant
หรือคลาส java.time อื่น ๆ โดยตรงกับฐานข้อมูลของคุณโดยใช้ JDBC 4.2 และใหม่กว่า
Instant
ชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)
Instant instant = myResultSet.getObject( … , Instant.class ) ;
หากคุณต้องทำงานร่วมกับสิ่งที่มีอยู่Timestamp
ให้แปลงเป็น java.time ทันทีโดยใช้วิธีการแปลงใหม่ที่เพิ่มลงในคลาสเก่า
Instant instant = myTimestamp.toInstant() ;
หากต้องการปรับเป็นเขตเวลาอื่นให้ระบุเขตเวลาเป็นZoneId
วัตถุ ระบุชื่อโซนเวลาที่เหมาะสมในรูปแบบของcontinent/region
เช่นAmerica/Montreal
, หรือAfrica/Casablanca
Pacific/Auckland
ห้ามใช้โซนหลอกตัวอักษร 3-4 ตัวเช่นEST
หรือIST
เนื่องจากไม่ใช่โซนเวลาจริงไม่เป็นมาตรฐานและไม่ซ้ำกัน (!)
ZoneId z = ZoneId.of( "America/Montreal" ) ;
นำไปใช้กับการInstant
สร้างZonedDateTime
วัตถุ
ZonedDateTime zdt = instant.atZone( z ) ;
หากต้องการสร้างสตริงสำหรับแสดงต่อผู้ใช้ให้ค้นหา Stack Overflow DateTimeFormatter
เพื่อค้นหาการอภิปรายและตัวอย่างมากมาย
คำถามของคุณเกี่ยวกับการไปในทิศทางอื่นตั้งแต่การป้อนข้อมูลผู้ใช้ไปจนถึงวัตถุวันที่และเวลา โดยทั่วไปแล้ววิธีที่ดีที่สุดคือแบ่งการป้อนข้อมูลของคุณออกเป็นสองส่วนวันที่และเวลาของวัน
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
คำถามของคุณไม่ชัดเจน คุณต้องการตีความวันที่และเวลาที่ผู้ใช้ป้อนให้เป็น UTC หรือไม่? หรือในเขตเวลาอื่น?
ถ้าคุณหมายถึง UTC สร้างOffsetDateTime
ด้วยการชดเชยการใช้อย่างต่อเนื่องสำหรับ ZoneOffset.UTC
UTC,
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
หากคุณหมายถึงเขตเวลาอื่นให้รวมเข้ากับวัตถุเขตเวลา a ZoneId
. แต่เขตเวลาใด คุณอาจตรวจพบเขตเวลาเริ่มต้น หรือหากสำคัญคุณต้องยืนยันกับผู้ใช้เพื่อให้แน่ใจว่าเจตนาของพวกเขา
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
เพื่อให้ได้วัตถุที่ง่ายกว่าซึ่งอยู่ใน UTC ตามคำนิยามเสมอให้แยกInstant
ไฟล์.
Instant instant = odt.toInstant() ;
…หรือ…
Instant instant = zdt.toInstant() ;
ส่งไปยังฐานข้อมูลของคุณ
myPreparedStatement.setObject( … , instant ) ;
เกี่ยวกับ java.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปยังคลาสjava.time
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
จะหาคลาส java.time ได้ที่ไหน?
- Java SE 8 , Java SE 9และใหม่กว่า
- ในตัว.
- ส่วนหนึ่งของ Java API มาตรฐานพร้อมการใช้งานแบบรวม
- Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
- Java SE 6และ Java SE 7
- มากของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
- Android
- การใช้งานคลาส java.time เวอร์ชันล่าสุดของ Android
- สำหรับก่อนหน้านี้ของ Android ที่ThreeTenABPโครงการปรับThreeTen-ย้ายกลับ (ดังกล่าวข้างต้น) ดูวิธีใช้ ThreeTenABP … .
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย