Tôi có nên sử dụng các lớp ngày và giờ Java hay đi với thư viện bên thứ 3 như Joda Time không?


147

Tôi đang tạo một hệ thống dựa trên web sẽ được sử dụng ở các quốc gia từ khắp nơi trên thế giới. Một loại dữ liệu phải được lưu trữ là ngày và giờ.

Những ưu và nhược điểm của việc sử dụng các lớp ngày và giờ Java so với các thư viện bên thứ 3 như thời gian Joda là gì? Tôi đoán các thư viện bên thứ ba này tồn tại vì một lý do chính đáng, nhưng tôi chưa bao giờ thực sự so sánh chúng với nhau.


5
Để làm rõ một số ý kiến, trong khi Joda-Time tiếp tục, API kế tiếp của nó là API ngày và giờ thực sự được lên kế hoạch để trở thành một phần của Java 8 trong gói java.time . Oracle có một bản thảo của một hướng dẫn . JDBC 4.2 sẽ xử lý các kiểu dữ liệu mới.
Basil Bourque

Câu trả lời:


197

EDIT: Bây giờ Java 8 đã được phát hành, nếu bạn có thể sử dụng nó, hãy làm như vậy! java.timethậm chí còn sạch hơn Joda Time, theo quan điểm của tôi. Tuy nhiên, nếu bạn bị mắc kẹt trước Java-8, hãy đọc tiếp ...

Max yêu cầu những ưu và nhược điểm của việc sử dụng Joda ...

Ưu điểm:

  • Nó hoạt động rất tốt. Tôi hoàn toàn nghi ngờ rằng có rất ít lỗi trong Joda so với các thư viện Java tiêu chuẩn. Một số lỗi trong các thư viện Java thực sự rất khó (nếu không nói là không thể) do thiết kế.
  • Nó được thiết kế để khuyến khích bạn suy nghĩ về việc xử lý ngày / giờ theo đúng cách - tách biệt khái niệm "giờ địa phương" (ví dụ: "đánh thức tôi lúc 7 giờ sáng dù tôi đang ở đâu") và ngay lập tức ("Tôi đang gọi James vào lúc 3 giờ chiều PST, có thể không phải là 3 giờ chiều, nhưng đó là cùng một lúc ")
  • Tôi tin rằng nó làm cho nó dễ dàng hơn để cập nhật cơ sở dữ liệu múi giờ, mà làm thay đổi tương đối thường xuyên
  • Nó có một câu chuyện bất biến tốt, giúp cuộc sống IME dễ dàng hơn rất nhiều .
  • Xuất phát từ tính không thay đổi, tất cả các trình định dạng đều an toàn cho luồng, điều này thật tuyệt vì bạn hầu như luôn muốn sử dụng lại một trình định dạng duy nhất thông qua ứng dụng
  • Bạn sẽ bắt đầu học java.timevề Java 8, vì chúng ít nhất tương tự nhau

Nhược điểm:

  • Đó là một API khác để tìm hiểu (mặc dù các tài liệu khá tốt)
  • Đó là một thư viện khác để xây dựng và triển khai
  • Khi bạn sử dụng Java 8, vẫn còn một số công việc để di chuyển các kỹ năng của bạn
  • Tôi đã không sử dụng DateTimeZoneBuilderhiệu quả trong quá khứ. Đây là một trường hợp sử dụng rất hiếm mặc dù.

Để đáp ứng ý tưởng của oxbow_lakes về việc xây dựng API nhỏ của riêng bạn một cách hiệu quả, đây là quan điểm của tôi về lý do tại sao đây là một ý tưởng tồi:

  • Đó là công việc. Tại sao làm việc khi nó đã được thực hiện cho bạn?
  • Một người mới tham gia vào nhóm của bạn có nhiều khả năng quen thuộc với Joda hơn là với API nhà của bạn
  • Bạn có thể hiểu sai về bất cứ điều gì ngoài những cách sử dụng đơn giản nhất ... và ngay cả khi ban đầu bạn nghĩ rằng bạn chỉ cần chức năng đơn giản, những điều này có thói quen phát triển phức tạp hơn, từng chút một. Thao tác ngày và thời gian là khó để làm đúng. Hơn nữa, các API Java tích hợp khó sử dụng đúng cách - chỉ cần xem các quy tắc về cách thức số học ngày / giờ của API lịch hoạt động. Xây dựng bất cứ thứ gì trên đầu trang là một ý tưởng tồi thay vì sử dụng một thư viện được thiết kế tốt để bắt đầu.

5
@adi: Đã cập nhật - nó vẫn hợp lệ, nhưng hy vọng rằng JSR-310 sẽ là một phần của Java 8, nhưng nó không phải là một phần của Java 7.
Jon Skeet

2
@JonSkeet Điều này có lẽ nên được cập nhật kể từ khi giới thiệu java-8
Sionnach733

@ Sionnach733: Tôi sẽ không cập nhật tất cả, nhưng tôi sẽ thêm một cái gì đó khi bắt đầu.
Jon Skeet

2
Có một backport java.time.*cho Java 6 và 7: threeten.org/threetenbp
Miscreant

24

Chà, trừ khi bạn có ý định chờ Java 8, hy vọng rằng họ sẽ triển khai API tốt hơn để thao túng ngày và giờ, vâng, làm ơn, hãy sử dụng Joda-Time . Đó là tiết kiệm thời gian và tránh nhiều đau đầu.


Ưu và nhược điểm? Tôi chưa bao giờ sử dụng thời gian của Joda - sẽ rất thú vị khi nghe mọi người thích gì về nó.
Max Stewart

15

Câu trả lời là: nó phụ thuộc

JODA (và JSR-310) là một thư viện ngày / giờ đầy đủ chức năng, bao gồm hỗ trợ để sử dụng với nhiều hệ thống lịch.

Cá nhân tôi thấy JODA là một bước đi quá xa về độ phức tạp cho những gì tôi cần. 2 lỗi chính (IMHO) trong java DateCalendarcác lớp tiêu chuẩn là:

  1. Họ là đột biến
  2. Họ trộn lẫn khái niệm một ngày trong tháng từ một thời gian tức thì

Mặc dù những điều này được giải quyết bởi JODA, nhưng bạn sẽ thấy khá dễ dàng để cuộn các lớp của riêng mình YearMonthDayInstantcả hai đều sử dụng các lớp java dưới mui xe để tính toán "lịch" thực tế. Sau đó, bạn không cần phải tự làm quen với API> 100 lớp, một cơ chế định dạng / phân tích cú pháp khác, v.v.

Tất nhiên, nếu bạn cần thể hiện đầy đủ các niên đại khác nhau (ví dụ: tiếng Do Thái) hoặc muốn có thể xác định hệ thống Lịch tưởng tượng của riêng bạn (ví dụ: đối với trò chơi bạn đang viết) thì có lẽ JODA hoặc JRS-310 là dành cho bạn. Nếu không, sau đó tôi sẽ đề nghị rằng lăn của riêng bạn có thể là cách để đi.

Người dẫn đầu về thông số kỹ thuật của JSR-310 là Stephen Colebourne, người đã viết JODA ở vị trí số 1, do đó sẽ thay thế một cách hợp lý JODA.


16
không nên được phát minh lại bởi những người không chuyên, IMO.
Jon Skeet

6
Tôi cũng không phải là kẻ ngốc, nhưng tôi vẫn gặp vấn đề với API D & T của Java. Chúng rất dễ bị lạm dụng. Lý do tại sao mọi người có nhiều khả năng sử dụng Joda đúng cách là Joda được thiết kế tốt hơn - nó khuyến khích bạn làm điều đúng đắn.
Jon Skeet

6
Tôi tin tưởng một chuyên gia về bản thân mình vào bất kỳ ngày nào trong tuần khi nói đến API ngày / giờ. Không giống như đây là một số API của bên thứ 3 ngẫu nhiên không có ai sử dụng. Đối số "> 100 lớp" là một người rơm, vì rõ ràng bạn không cần phải học tất cả.
Jon Skeet

5
Tôi đoán chúng ta sẽ phải đồng ý khác nhau. Bất kỳ ngày / giờ đáng tin cậy nào được viết bởi các chuyên gia được thiết kế tốt, giúp tôi tránh phải làm công việc bẩn thỉu với thời gian, được tính là "phải có" theo quan điểm của tôi. Trong năm ngoái, tôi đã học được cách ghét đo thời gian của con người bằng một niềm đam mê.
Jon Skeet

5
Tự lăn lộn khi Joda tồn tại là một ý tưởng đơn giản khủng khiếp. Đừng làm điều đó. Đúng là Joda có hàng tá lớp học mà bạn sẽ không sử dụng, nhưng câu trả lời cho điều này khá đơn giản - đừng sử dụng những lớp bạn không cần. Có rất nhiều điều có thể sai khi viết thư viện loại này của riêng bạn - số lượng nỗ lực bạn sẽ phải bỏ ra là rất lớn, cả trong quá trình phát triển và thử nghiệm. Hoặc, bạn chỉ có thể thêm một thư viện. Sau đó, Joda có thêm lợi ích mà các tân binh cho đội của bạn có thể đã sử dụng trước đó, nhưng họ sẽ không sử dụng thư viện cây nhà của bạn.
Dawood ibn Kareem

7

Tất cả phụ thuộc vào những gì bạn đang làm với ngày. Nếu bạn chỉ đơn giản là duy trì chúng, thì các Ngày được xây dựng trong Java có thể sẽ làm tất cả những gì bạn muốn. Tuy nhiên, nếu bạn đang thực hiện thao tác ngày giờ rộng rãi, có lẽ bạn sẽ tốt hơn với Joda.


7

Bạn nên sử dụng thư viện Joda-Time, bởi vì:

  1. Joda-Time hỗ trợ tiêu chuẩn ISO 8601 , đây là một cách tiêu chuẩn để
    thể hiện ngày.
  2. Thêm và trừ một ngày / tháng / năm dễ dàng hơn trong Joda-Time so với java.util.date.
  3. Việc khởi tạo trước một ngày cho dễ dàng hơn rất nhiều trong Joda-Time.
  4. Joda-Time cũng hỗ trợ múi giờ.
  5. Joda-Time có phân tích cú pháp tích hợp tốt hơn. Một ngày sai như "2014 / 02-31" bị ném là lỗi:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Bạn có thể thích trang này để biết thêm chi tiết: http://swcodes.blogspot.com/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.