ฉันควรใช้คลาสวันที่และเวลาของ Java หรือไปกับห้องสมุดบุคคลที่สามเช่น Joda Time


147

ฉันกำลังสร้างระบบบนเว็บซึ่งจะใช้ในประเทศจากทั่วทุกมุมโลก ข้อมูลประเภทหนึ่งที่ต้องจัดเก็บคือวันที่และเวลา

ข้อดีและข้อเสียของการใช้คลาสวันที่และเวลาของ Java เทียบกับไลบรารีของบุคคลที่สามเช่น ภายนอกเวลา Jodaคืออะไร ฉันเดาว่าห้องสมุดบุคคลที่สามเหล่านี้มีอยู่ด้วยเหตุผลที่ดี แต่ฉันไม่เคยเปรียบเทียบพวกเขาเอง


5
เพื่อชี้แจงความคิดเห็นบางส่วน ... ในขณะที่ Joda-Time ดำเนินการต่อJSR 310: วันที่และเวลาของ APIจะถูกกำหนดให้เป็นส่วนหนึ่งของ Java 8 ภายใต้แพคเกจjava.time Oracle มีร่างของการกวดวิชา JDBC 4.2 จะจัดการกับชนิดข้อมูลใหม่
Basil Bourque

คำตอบ:


197

แก้ไข: ตอนนี้ Java 8 ได้รับการเผยแพร่ถ้าคุณสามารถใช้ทำเช่นนั้น! java.timeในมุมมองของฉันนั้นสะอาดกว่า Joda Time ด้วยซ้ำ อย่างไรก็ตามหากคุณติด pre-Java-8 ไว้อ่านต่อ ...

Max ถามถึงข้อดีข้อเสียของการใช้ Joda ...

ข้อดี:

  • มันใช้งานได้ดีมาก ฉันสงสัยอย่างยิ่งว่ามีข้อบกพร่องใน Joda น้อยกว่าไลบรารี Java มาตรฐาน ข้อบกพร่องบางอย่างในไลบรารี Java ยากมาก (ถ้าไม่เป็นไปไม่ได้) ในการแก้ไขเนื่องจากการออกแบบ
  • มันถูกออกแบบมาเพื่อกระตุ้นให้คุณคิดถึงการจัดการวันที่ / เวลาอย่างถูกต้อง - แยกแนวคิดของ "เวลาท้องถิ่น" (เช่น "ปลุกฉันตอนเจ็ดโมงเช้าไม่ว่าฉันจะอยู่ที่ไหน") และทันเวลา ("ฉันเรียกเจมส์ เวลา 15.00 น. PST อาจไม่ใช่เวลา 15.00 น. แต่เป็นเวลาเดียวกัน ")
  • ผมเชื่อว่ามันทำให้ง่ายต่อการปรับปรุงฐานข้อมูลเขตเวลาซึ่งไม่เปลี่ยนค่อนข้างบ่อย
  • มันมีเรื่องราวที่ไม่เปลี่ยนแปลงที่ดีซึ่งทำให้ชีวิตมีมากง่ายขึ้น IME
  • ตัวจัดรูปแบบทั้งหมดเป็นเธรดที่ปลอดภัยซึ่งยอดเยี่ยมเพราะคุณเกือบตลอดเวลาต้องการที่จะใช้ซ้ำจัดรูปแบบเดียวผ่านแอพลิเคชัน
  • คุณจะได้เริ่มต้นเรียนรู้java.timeใน Java 8 อย่างน้อยก็คล้ายกัน

จุดด้อย:

  • เป็นอีก API หนึ่งในการเรียนรู้ (แม้ว่าเอกสารจะค่อนข้างดี)
  • เป็นอีกหนึ่งห้องสมุดที่จะสร้างและปรับใช้
  • เมื่อคุณใช้ Java 8 ยังมีงานบางส่วนที่จะโยกย้ายทักษะของคุณ
  • ฉันล้มเหลวในการใช้สิ่งที่DateTimeZoneBuilderมีประสิทธิภาพในอดีต นี่เป็นกรณีการใช้งานที่หายากมาก

เพื่อตอบสนองต่อแนวคิดของ oxbow_lakes ในการสร้าง API ขนาดเล็กของคุณอย่างมีประสิทธิภาพต่อไปนี้เป็นมุมมองของฉันที่ว่าทำไมจึงเป็นความคิดที่ไม่ดี:

  • มันใช้งานได้ ทำไมทำงานเมื่อเสร็จแล้วสำหรับคุณ
  • ผู้มาใหม่ให้กับทีมของคุณมีแนวโน้มที่จะคุ้นเคยกับ Joda มากกว่า API ของคุณเอง
  • คุณมีแนวโน้มที่จะทำผิดพลาดไปกับสิ่งที่นอกเหนือจากการใช้งานที่ง่ายที่สุด ... และแม้ว่าในตอนแรกคุณคิดว่าคุณต้องการฟังก์ชั่นการใช้งานที่เรียบง่าย แต่สิ่งเหล่านี้ก็มีนิสัยที่ซับซ้อนมากขึ้น วันเวลาและการจัดการเป็นเรื่องยากที่จะทำอย่างถูกต้อง นอกจากนี้ Java APIs ในตัวนั้นใช้งานได้ยากเพียงดูกฎสำหรับการคำนวณวันที่ / เวลาของ API ของปฏิทิน การสร้างสิ่งต่าง ๆ เหล่านี้เป็นความคิดที่ดีแทนที่จะใช้ไลบรารีที่ออกแบบมาอย่างดีเพื่อเริ่มต้น

5
@adi: อัปเดต - มันยังใช้ได้ แต่หวังว่า JSR-310 จะเป็นส่วนหนึ่งของ Java 8 แต่มันไม่ได้เป็นส่วนหนึ่งของ Java 7
Jon Skeet

2
@JonSkeet สิ่งนี้ควรได้รับการอัปเดตตั้งแต่การเปิดตัว java-8
Sionnach733

@ Sionnach733: ฉันจะไม่อัปเดตทั้งหมด แต่ฉันจะเพิ่มบางอย่างในตอนเริ่มต้น
Jon Skeet

2
มีย้ายกลับคือjava.time.*: สำหรับ Java 6 และ 7 threeten.org/threetenbp
สารเลว

24

ดีถ้าคุณตั้งใจจะรอสำหรับ Java 8 หวังว่าพวกเขาจะดำเนินการAPI ที่ดีกว่าสำหรับการจัดการวันที่และเวลาใช่โปรดใช้Joda เวลา ประหยัดเวลาและหลีกเลี่ยงอาการปวดหัวมากมาย


ข้อดีและข้อเสีย? ฉันไม่เคยใช้เวลาของ Joda - น่าสนใจที่จะได้ยินว่าคนชอบอะไรเกี่ยวกับมัน
Max Stewart

15

คำตอบคือ: มันขึ้นอยู่กับ

JODA (และ JSR-310) เป็นไลบรารีวันที่ / เวลาที่ทำงานได้อย่างสมบูรณ์รวมถึงการรองรับการใช้งานกับระบบปฏิทินหลายระบบ

โดยส่วนตัวแล้วฉันพบว่า JODA เป็นก้าวที่ไกลเกินไปในแง่ของความซับซ้อนสำหรับสิ่งที่ฉันต้องการ ข้อผิดพลาด 2 หลัก (IMHO) ใน java มาตรฐานDateและCalendarคลาสคือ:

  1. พวกเขาไม่แน่นอน
  2. พวกเขาผสมผสานแนวคิดของปี - เดือน - วันจากการโต้ตอบแบบทันทีในเวลา

ถึงแม้ว่าเหล่านี้ได้รับการแก้ไขโดย Joda คุณจะพบว่ามันค่อนข้างง่ายที่จะม้วนชั้นเรียนของคุณเองสำหรับการYearMonthDayและInstantซึ่งทั้งคู่ใช้คลาส Java ภายใต้ประทุนสำหรับการคำนวณ "calendrical" จริง จากนั้นคุณไม่ต้องทำความคุ้นเคยกับ API> 100 คลาสกลไกการจัดรูปแบบ / การแยกวิเคราะห์ที่แตกต่างกันเป็นต้น

แน่นอนถ้าคุณต้องการแสดงเหตุการณ์ที่แตกต่างกันอย่างสมบูรณ์ (เช่นฮีบรู) หรือต้องการกำหนดระบบปฏิทินจินตภาพของคุณเอง (เช่นสำหรับเกมที่คุณกำลังเขียน) บางที JODA หรือ JRS-310 ก็เหมาะสำหรับคุณ ถ้าไม่เช่นนั้นฉันขอแนะนำว่าการกลิ้งตัวคุณเองอาจเป็นไปได้

ข้อมูลจำเพาะของ JSR-310 คือ Stephen Colebourne ผู้เขียน JODA ในอันดับที่ 1 ดังนั้นจะแทนที่ JODA อย่างมีเหตุผล


16
ไม่ควรสร้างใหม่โดยผู้ที่ไม่ใช่ผู้เชี่ยวชาญ IMO
Jon Skeet

6
ฉันไม่ใช่คนปัญญาอ่อน แต่ฉันก็ยังมีปัญหากับ Java D&T APIs พวกมันเจ็บปวดง่ายที่จะนำไปใช้ในทางที่ผิด เหตุผลที่ผู้คนมีแนวโน้มที่จะใช้ Joda ได้อย่างถูกต้องมากขึ้นก็คือ Joda ได้รับการออกแบบที่ดีกว่า - มันกระตุ้นให้คุณทำสิ่งที่ถูกต้อง
Jon Skeet

6
ฉันเชื่อใจผู้เชี่ยวชาญมากกว่าตัวเองทุกวันในสัปดาห์เมื่อพูดถึง API แบบวันที่ / เวลา ไม่ใช่ว่านี่เป็น API ของบุคคลที่สามแบบสุ่มที่ไม่มีใครใช้งาน อาร์กิวเมนต์ "> 100 คลาส" เป็นคนฟางเนื่องจากคุณไม่จำเป็นต้องเรียนรู้ทั้งหมด
Jon Skeet

5
ฉันเดาว่าเราจะต้องเห็นด้วยที่จะแตกต่างกัน วันที่ / เวลาที่เชื่อถือได้ใด ๆ ที่เขียนโดยผู้เชี่ยวชาญและได้รับการออกแบบมาอย่างดีซึ่งหลีกเลี่ยงการต้องทำงานที่สกปรกด้วยเวลาที่คิดว่าเป็น "ต้องมี" จากมุมมองของฉัน ปีที่แล้วฉันเรียนรู้ที่จะเกลียดการวัดเวลาของมนุษย์ด้วยความหลงใหล
Jon Skeet

5
การหมุนของคุณเองเมื่อ Joda มีอยู่นั้นเป็นความคิดที่แย่มาก อย่าทำอย่างนั้น เป็นความจริงที่ Joda มีชั้นเรียนหลายสิบชั้นที่คุณไม่ได้ใช้ แต่คำตอบสำหรับเรื่องนี้ค่อนข้างง่าย - อย่าใช้สิ่งที่คุณไม่ต้องการ มีหลายสิ่งหลายอย่างที่ผิดไปจากการเขียนไลบรารี่ของคุณเอง - ความพยายามที่คุณต้องใส่มีขนาดใหญ่มากทั้งในการพัฒนาและการทดสอบ หรือคุณสามารถเพิ่มห้องสมุดได้หนึ่งห้องสมุด จากนั้น Joda มีสิทธิประโยชน์เพิ่มเติมที่สมาชิกใหม่ของทีมของคุณอาจเคยใช้มาก่อน แต่พวกเขาจะไม่ใช้ห้องสมุดพื้นบ้านของคุณ
Dawood ibn Kareem

7

ทุกอย่างขึ้นอยู่กับสิ่งที่คุณทำกับวันที่ หากคุณเพียงแค่ยืนยันพวกเขาพวกเขาสร้าง Java ในวันที่อาจจะทำทุกอย่างที่คุณต้องการ อย่างไรก็ตามถ้าคุณทำการจัดการวันเวลาอย่างกว้างขวางคุณน่าจะดีกว่ากับ Joda


7

คุณควรใช้ห้องสมุด Joda-Time เพราะ:

  1. Joda-Time รองรับมาตรฐาน ISO 8601ซึ่งเป็นวิธีมาตรฐานในการ
    แสดงวันที่
  2. การเพิ่มและลบวัน / เดือน / ปีนั้นง่ายกว่าใน Joda-Time มากกว่า java.util.date
  3. การเริ่มต้นตามวันที่ให้นั้นง่ายกว่ามากใน Joda-Time
  4. Joda-Time รองรับเขตเวลาเช่นกัน
  5. Joda-Time มีการแยกวิเคราะห์ในตัวที่ดีขึ้น มีการโยนวันที่ผิดเช่น "2014-02-31" เป็นข้อผิดพลาด:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

คุณอาจต้องการหน้านี้สำหรับรายละเอียดเพิ่มเติม: http://swcodes.blogspot.com/

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