Joda Time กับ Java Time


19

ถึงแม้ว่า Joda จะมีคุณสมบัติที่หลากหลายและมีความซับซ้อนมากกว่าเวลา Java มาตรฐาน แต่ก็อาจไม่ใช่สิ่งที่ดีที่สุดในการใช้งานเสมอไป ฉันจะตัดสินใจได้อย่างไรว่าฉันควรใช้ Joda Time หรือ Java Time ในโค้ด Java ใด ๆ

มีแนวทางบางอย่างที่บอกเราว่าจะเลือกแนวทางที่เหมาะสมหรือไม่ขึ้นอยู่กับข้อกำหนดของเรา


5
รับที่ดีที่สุดของโลกทั้งสองโดยใช้วันและเวลาใหม่ API รวมอยู่ใน Java 8 มันได้รับอิทธิพลอย่างมากจาก Joda Time ในความเป็นจริงผู้แต่งหลักคือ Stephen Colebourne ผู้แต่ง Joda Time
โจอาคิมซาวเออ

1
@JoachimSauer มันปรากฏตัวในรุ่นสุดท้ายหรือจะเกิดขึ้นเมื่อ Java 8 จะเปิดตัว?
m3th0dman

@ m3th0dman: มันจะรวมอยู่ในการเปิดตัว Java 8 ขั้นสุดท้าย แต่ยังไม่ได้เปิดตัว GA อยู่ในขณะนี้กำหนดไว้สำหรับ 2013/09/09
โจอาคิมซาวเออ

ทั้งคลาส Joda-Time และคลาสดั้งเดิมของวันที่ Java ถูกกำหนดโดยคลาสjava.time ที่สร้างขึ้นใน Java 8, Java 9 และใหม่กว่า
Basil Bourque

คำตอบ:


29

Joda Time เป็นการปรับปรุงไลบรารีเวลาของ Java ซึ่งเป็นตัวเลือกที่ถูกต้องเกือบตลอดเวลานอกเหนือจากข้อยกเว้นต่อไปนี้:

  1. เมื่อเป็นการยากหรือไม่พึงปรารถนาที่จะเพิ่มการพึ่งพาบุคคลที่สามให้กับโครงการของคุณ

  2. เมื่อมีการใช้งานในส่วนต่อประสานสาธารณะจะทำให้เกิดปัญหาเช่นการรับ ORM เพื่อจัดการฟิลด์เวลาทั้ง java และ Joda

อย่างไรก็ตามในกรณีของ 2) จะดีกว่าหากใช้ Joda ภายในหากเป็นไปได้

สิ่งที่กล่าวมาข้างต้นนั้นควรค่าแก่การระลึกไว้เสมอ หากมีข้อสงสัยให้ไปกับ Joda


กรุณาบอกฉันว่า "ใช้ Joda ภายใน" หมายความว่าอย่างไร ฉันเป็นผู้เริ่มต้นและฉันไม่รู้สิ่งเหล่านี้ทั้งหมด
อัศวินเจได

5
@Jedi Knight: มันหมายถึงแอปพลิเคชันที่ใช้ Joda สำหรับตรรกะของตัวเองและจะแปลงเป็น / จาก java.util.Date เมื่อมันสื่อสารกับระบบภายนอกที่ต้องใช้มัน
Michael Borgwardt

2
โดย 'ภายใน' อาจเป็นภายในแอปพลิเคชันโดยรวม (ตามตัวอย่างของ Michael) แต่อาจอยู่ภายในคลาสหรือเป็นวิธีการเฉพาะ พูดเช่นว่าคุณมีวิธีการยูทิลิตี้ที่ใช้วัตถุ Java วันที่สองและคำนวณจำนวนวันทำงานระหว่างพวกเขา แต่มันมีข้อผิดพลาด ในการแก้ไขปัญหาอาจเป็นการง่ายกว่าที่จะเขียนวิธีการใหม่โดยใช้ JodaTime แทน แต่คุณอาจไม่สามารถจ่ายเวลาในการปรับเปลี่ยนรหัสทั้งหมดที่เรียกใช้วิธีการนั้นดังนั้นคุณจึงไม่เปลี่ยนแปลงลายเซ็นของวิธีการ ในกรณีนี้คุณกำลังใช้ Joda "ภายใน" ในวิธีการนั้น
Robert Johnson

FYI โครงการJoda-Timeขณะนี้อยู่ในโหมดบำรุงรักษาโดยทีมงานให้คำแนะนำการย้ายถิ่นไปยังคลาสjava.time ดูการสอนโดยออราเคิล
Basil Bourque

13

โปรดทราบว่าในเว็บไซต์Joda-Timeระบุว่า:

คลาสวันที่และเวลามาตรฐานก่อน Java SE 8 ไม่ดี ด้วยการจัดการกับปัญหานี้ Joda-Time ได้กลายเป็นห้องสมุดมาตรฐานวันที่และเวลาจริงสำหรับ Java โปรดทราบว่าจาก Java SE 8 เป็นต้นไปผู้ใช้จะถูกขอให้ย้ายไปยัง java.time (JSR-310)

ผู้สนับสนุนหลักในการJoda-Time , jodastephenยังเป็นผู้สนับสนุนหลักสำหรับ JSR-310 ที่สามารถมองเห็นได้บนพื้นที่เก็บข้อมูล GitHubเกี่ยวข้องกับhttp://www.threeten.org/ โดยวิธีการที่jodastephenยังมีการจัดการเพื่อ ...

ฉันคิดว่ามันปลอดภัยที่จะระบุว่าเราสามารถรู้สึกสบายใจและปลอดภัยด้วยDate and Time API ใหม่ที่มีให้ใน Java 8เป็นต้นไป

ข้อมูลอ้างอิงเพิ่มเติมบางส่วน:


12

API วันที่มาตรฐานของ Java แตกหักอย่างมากซึ่งฉันมักจะพิจารณาเพียงเพิ่ม Joda Time ไปยังส่วนขยายไลบรารีของ JVM เพื่อให้โหลดบน classpath โดยค่าเริ่มต้นด้วยส่วนที่เหลือของ Java API

หากคุณได้รับมอบหมายให้ดำเนินการติดตั้งเพิ่มเติมให้เป็นสากลและเขตเวลาในแอปพลิเคชัน Java รุ่นเก่าและพยายามใช้ Java API มาตรฐานเพียงอย่างเดียวคุณจะเข้าใจว่าฉันหมายถึงอะไร ฉันสามารถเปลี่ยนรหัสบรรทัด asinine นับพันให้เป็นน้อยกว่าหนึ่งร้อย การเพิ่มผลิตภาพนั้นไม่สามารถนึกได้

นอกจากนี้ API วันที่มาตรฐานนั้นไม่สามารถหยั่งรู้ได้ซึ่ง fluid Joda API สามารถหยิบขึ้นมาได้ในเวลาไม่กี่สัปดาห์ การเปรียบเทียบของคุณในการพยายามไปยังเกาะที่อยู่ห่างออกไปสองไมล์นั้นคล้ายกับสิ่งต่อไปนี้มากขึ้น

1) เรือยนต์ที่จะพาคุณไปที่เกาะในเวลาเพียง 6 นาที

หรือ...

2) แพไม้ไผ่ชั่วคราวที่ผูกไว้กับเถาวัลย์ระหว่างพายุเฮอริเคนนำโดยคนบ้าที่มีเพื่อนที่ดีที่สุดคือวอลเลย์บอล

ตามที่คำตอบอื่น ๆ ได้ระบุไว้ข้อเสียบางอย่างเช่น ORM จะกลายเป็นไม่มีอยู่ในขณะนี้ Hibernate มีปลั๊กอินที่อนุญาตให้คุณสมบัติ Joda ประเภทถั่วถูกแมปไปยังเขตข้อมูลวันที่ / เวลา JPA อาจมีคำตอบสำหรับสิ่งนี้เช่นกัน

หากคุณต้องการให้แอปพลิเคชันของคุณมีรอยเท้ามินิมัลลิสต์เป็นแอพพลิเคชั่นเดสก์ท็อปเนื่องจากเกี่ยวข้องกับพื้นที่ว่างในดิสก์บางที Java อาจไม่ใช่ตัวเลือกภาษาที่เหมาะสม


FYI โครงการJoda-Timeขณะนี้อยู่ในโหมดบำรุงรักษาโดยทีมงานให้คำแนะนำการย้ายถิ่นไปยังคลาสjava.time ดูการสอนโดยออราเคิล
Basil Bourque

8

อีกจุดหนึ่ง: Java-Time (ie Date) ไม่ใช่ ThreadSafe แต่ JodaTime เป็น ดังนั้น JodaTime จึงเป็นที่ต้องการเมื่อมีความต้องการ

  • MultiThreaded Environment เข้าถึงทรัพยากรทั่วไป
  • การซิงโครไนซ์เวลาส่วนกลางเช่นสถานการณ์

หรืออย่างอื่นสำหรับแอปพลิเคชันอย่างง่าย Java-Time ก็โอเค


แม้แต่ DateTime ยังไม่ใช่ ThreadSafe ใช่ไหม แก้ไขฉันถ้าฉันทำผิด
vintesh

3
ห้องสมุด Joda ส่วนใหญ่รวมถึงคลาส DateTime นั้นไม่เปลี่ยนรูปแบบและปลอดภัยต่อเธรด อย่างไรก็ตามมีคลาสที่ไม่แน่นอนไม่กี่เธรดที่ไม่ปลอดภัย ดูjoda-time.sourceforge.net/faq.html#threading
Robert Johnson

1
ความปลอดภัยของเธรดสำหรับjava.timeดำเนินการผ่านการเปลี่ยนแปลงไม่ได้ ดูstackoverflow.com/questions/9303532/... วิธีนี้ใช้ได้ดีสำหรับทั้งแอปพลิเคชันที่เรียบง่ายและซับซ้อน แม้แต่เอกสาร APIระบุว่า "ทุกชั้นเรียนไม่เปลี่ยนรูปและปลอดภัยต่อเธรด" (อ้างอิงจากย่อหน้าที่สองอย่างแท้จริง) java.utilคลาสเก่าในทางกลับกันมีปัญหาหลายประการ ฉันรู้ว่าคำตอบนี้หมายถึงสิ่งหลัง แต่สำคัญที่ต้องสร้างความแตกต่างในขณะนี้
YoYo

ไม่แสดงเวลาวันที่เนื่องจากค่าไม่เปลี่ยนรูปเป็นเพียงแค่บ้า ฉันรู้ว่าตอนนี้ได้รับการแก้ไขแล้ว แต่จริงๆแล้วพวกเขากำลังคิดอะไรอยู่ในโลกนี้
Aluan Haddad

2

java.timeกรอบแทนที่ทั้งมรดกเรียนวันเวลาและ Joda เวลา

อัปเดต:คลาสวันที่เก่าเวลาที่จัดส่งพร้อมกับเวอร์ชันแรกสุดของ Java ตอนนี้เป็นรุ่นเก่าแทนที่ด้วยคลาส java.time ที่สร้างขึ้นใน Java 8, Java 9 และใหม่กว่าอย่างเป็นทางการ

Date, Calendar, SimpleDateFormatและjava.sql.*การเรียนวันเวลาของทุกคนควรจะหลีกเลี่ยง ไม่จำเป็นต้องใช้คลาสที่สับสนสับสนและออกแบบมาไม่ดี พวกเขาทั้งหมดจะถูกแทนที่ด้วยคลาส java.time วัตถุประสงค์เพียงอย่างเดียวของพวกเขาในขณะนี้คือเพื่อรักษารหัสเดิมที่มีอยู่ เมื่อเชื่อมต่อกับรหัสเก่าคุณสามารถแปลงเป็น / จาก java.time โดยเรียกวิธีการใหม่ที่เพิ่มเข้ามาในคลาสเก่า สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแปลงโปรดดู: แปลง java.util.Date เป็นประเภท“ java.time” ชนิดใด .

Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน โครงการ Joda-Time เป็นแรงบันดาลใจให้กับเฟรมเวิร์ก java.time ทั้งสองถูกนำโดยคนคนเดียวกัน, สตีเฟ่น Colebourne คุณสามารถนึกถึง java.time ในการเขียนใหม่ / ออกแบบใหม่ของ Joda-Time ซึ่งเป็นรหัสใหม่ทั้งหมด แต่ใช้สิ่งที่เรียนรู้ในช่วงหลายปีที่ผ่านมาจากการสร้างห้องสมุดวันที่ที่ครอบคลุมและซับซ้อนเป็นครั้งแรกของอุตสาหกรรม

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย

ฟังก์ชั่นจาวาส่วนใหญ่นั้นกลับไปที่ Java 6 และ 7 ในThreeTen-Backportและปรับใช้กับAndroidในThreeTenABP เพิ่มเติม (ดูวิธีการใช้ ... )

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.