TL; DR
แนะนำ "แนวทางปฏิบัติที่ดีที่สุด" ในปัจจุบันไปรอบ ๆDate
และCalendar
มันเป็นการดีที่สุดที่จะชอบCalendar
มากกว่าเสมอDate
หลีกเลี่ยงชั้นเรียนดั้งเดิมเหล่านี้โดยสิ้นเชิง ใช้คลาสjava.timeแทน
รายละเอียด
คำตอบโดย Ortomala Lokni เป็นสิทธิที่จะขอแนะนำให้ใช้ที่ทันสมัยjava.timeเรียนมากกว่าลำบากเก่าเรียนมรดกวันที่เวลา ( Date
,Calendar
ฯลฯ ) แต่คำตอบนั้นแสดงให้เห็นว่าคลาสผิดปกติเทียบเท่า (ดูความคิดเห็นของฉันในคำตอบนั้น)
ใช้ java.time
คลาส java.time มีการปรับปรุงมากมายในคลาสวันที่และเวลาเดิม คลาสเก่านั้นได้รับการออกแบบไม่ดีสับสนและลำบาก คุณควรหลีกเลี่ยงคลาสเก่าเมื่อเป็นไปได้ แต่เมื่อคุณต้องการแปลงเป็น / จากเก่า / ใหม่คุณสามารถทำได้โดยการเรียกวิธีการใหม่เพิ่มไปยังเก่าคลาส
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแปลงดูคำตอบและไดอะแกรมที่ดีของฉันกับคำถามอื่นแปลง java.util.Date เป็นประเภท“ java.time” ชนิดใด.
การค้นหา Stack Overflow ให้ตัวอย่างคำถามและคำตอบจำนวนมากเกี่ยวกับการใช้ java.time แต่นี่เป็นบทสรุปอย่างรวดเร็ว
Instant
Instant
ได้รับในขณะปัจจุบันที่มี Instant
ชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)
Instant instant = Instant.now();
ZonedDateTime
เพื่อดูว่า ช่วงเวลาที่พร้อมกันเดียวกันผ่านเลนส์ของบางภูมิภาคโดยเฉพาะอย่างยิ่งในเวลาที่ผนังนาฬิกาใช้โซนเวลา ( ZoneId
) ZonedDateTime
เพื่อให้ได้
เขตเวลา
ระบุชื่อโซนเวลาที่เหมาะสมในรูปแบบของcontinent/region
เช่นAmerica/Montreal
,Africa/Casablanca
Pacific/Auckland
หรือ อย่าใช้ตัวย่อ 3-4 ตัวอักษรเช่นEST
หรือIST
เพราะไม่ใช่เขตเวลาจริงไม่ใช่แบบมาตรฐานและไม่ซ้ำกัน (!)
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
สาขา
โซนเวลาเป็นประวัติศาสตร์ของภูมิภาคของการเปลี่ยนแปลงในของมันชดเชยจาก UTC แต่บางครั้งคุณได้รับการชดเชยโดยไม่มีโซนเต็ม ในกรณีนั้นให้ใช้OffsetDateTime
คลาส
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
การใช้เขตเวลานั้นดีกว่าการใช้ออฟเซ็ตเพียงอย่างเดียว
LocalDateTime
"ท้องถิ่น" ใน Local…
ชั้นเรียนหมายถึงท้องที่ใด ๆไม่ใช่เฉพาะท้องที่ ดังนั้นชื่อสามารถตอบโต้ได้ง่าย
LocalDateTime
, LocalDate
และLocalTime
ไม่มีข้อมูลเกี่ยวกับออฟเซ็ตหรือเขตเวลาอย่างจงใจ ดังนั้นพวกเขาจึงไม่ได้เป็นตัวแทนช่วงเวลาที่แท้จริงพวกเขาเป็นไม่ได้จุดบนไทม์ไลน์ หากมีข้อสงสัยหรือในความสับสนให้ใช้มากกว่าZonedDateTime
LocalDateTime
ค้นหา Stack Overflow เพื่อการสนทนาที่มากขึ้น
เงื่อนไข
อย่า conflate วัตถุวันที่เวลากับสตริงที่แสดงค่าของพวกเขา คุณสามารถแยกสตริงเพื่อรับวัตถุวันที่และคุณสามารถสร้างสตริงจากวัตถุวันที่ แต่สตริงจะไม่เป็นวันที่และเวลา
เรียนรู้เกี่ยวกับรูปแบบISO 8601 มาตรฐานที่ใช้โดยค่าเริ่มต้นในคลาส java.time
เกี่ยวกับ java.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, Calendar
และSimpleDateFormat
และ
Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปคคือJSR 310310
การใช้ไดรเวอร์ JDBCเป็นไปตามมาตรฐานJDBC 4.2หรือใหม่กว่าคุณสามารถแลกเปลี่ยนjava.time ได้อบเจ็กต์โดยตรงกับฐานข้อมูลของคุณ ไม่จำเป็นต้องใช้สตริงหรือคลาส 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
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย