Giờ Joda vs Giờ Java


19

Mặc dù Joda có tính năng phong phú và tinh vi hơn thời gian Java tiêu chuẩn, nhưng nó có thể không phải luôn luôn là thứ tốt nhất để sử dụng. Làm cách nào để quyết định xem tôi nên sử dụng Thời gian Joda hay Thời gian Java trong bất kỳ mã Java nào?

Có một số loại hướng dẫn cho chúng ta biết làm thế nào để chọn đúng tùy theo yêu cầu của chúng tôi?


5
Tận dụng tốt nhất cả hai thế giới, bằng cách sử dụng API Ngày & Giờ mới có trong Java 8 . Nó bị ảnh hưởng nặng nề bởi Joda Time. Trên thực tế, tác giả chính là Stephen Colebourne, tác giả của Joda Time.
Joachim Sauer

1
@JoachimSauer Nó đã xuất hiện trong bản phát hành cuối cùng hay điều này sẽ xảy ra khi Java 8 sẽ khởi chạy?
m3th0dman 17/03/13

@ m3th0dman: nó sẽ được bao gồm trong bản phát hành Java 8 cuối cùng, nó chưa được phát hành. GA hiện đang được lên kế hoạch cho 2013-09-09 .
Joachim Sauer

Cả các lớp thời gian ngày Joda và thời gian ban đầu của Java hiện đã bị lỗi thời bởi các lớp java.time được tích hợp trong Java 8, Java 9 và sau đó.
Basil Bourque

Câu trả lời:


29

Joda Time là một cải tiến so với thư viện thời gian Java mà nó hầu như luôn là lựa chọn đúng đắn, ngoài các trường hợp ngoại lệ sau:

  1. Khi khó khăn hoặc không mong muốn để thêm phụ thuộc của bên thứ ba vào dự án của bạn

  2. Khi việc sử dụng nó trong giao diện công cộng sẽ gây ra sự cố, ví dụ: lấy ORM để xử lý cả hai trường thời gian java và Joda

Tuy nhiên, trong trường hợp 2) vẫn nên sử dụng Joda trong nội bộ nếu có thể.

Những điều trên đáng để ghi nhớ, nhưng nên hiếm. Nếu nghi ngờ, hãy đi với Joda.


Xin vui lòng cho tôi biết "sử dụng Joda trong nội bộ" nghĩa là gì. Tôi là người mới bắt đầu và tôi không biết tất cả những điều này.
Hiệp sĩ Jedi

5
@Jedi Knight: có nghĩa là ứng dụng sử dụng Joda cho logic riêng của mình và chỉ chuyển đổi thành / từ java.util.Date khi giao tiếp với một hệ thống bên ngoài yêu cầu nó.
Michael Borgwardt

2
Theo 'nội bộ', nó có thể là nội bộ cho toàn bộ ứng dụng (như trong ví dụ của Michael), nhưng nó có thể là nội bộ đối với một lớp hoặc chỉ là một phương thức cụ thể. Ví dụ, giả sử rằng bạn có một phương thức tiện ích lấy hai đối tượng Ngày Java và tính toán số ngày làm việc giữa chúng, nhưng nó có một lỗi. Để khắc phục, thay vào đó, có thể dễ dàng hơn để viết lại phương thức đó bằng cách sử dụng JodaTime nhưng bạn có thể không đủ thời gian để cấu trúc lại tất cả mã gọi phương thức, vì vậy bạn không thay đổi chữ ký phương thức. Trong trường hợp này, bạn đang sử dụng Joda "nội bộ" trong phương pháp đó.
Robert Johnson

FYI, dự án Joda-Time hiện đang ở chế độ bảo trì , với nhóm tư vấn di chuyển đến các lớp java.time . Xem Hướng dẫn của Oracle .
Basil Bourque

13

Lưu ý rằng trên trang web Joda-Time có ghi:

Các lớp ngày và giờ tiêu chuẩn trước Java SE 8 rất kém. Bằng cách giải quyết vấn đề này, Joda-Time đã trở thành thư viện ngày và giờ tiêu chuẩn thực tế cho Java. Lưu ý rằng từ Java SE 8 trở đi, người dùng được yêu cầu di chuyển sang java.time (JSR-310).

Người đóng góp chính cho Joda-Time , jodastephen , cũng là người đóng góp chính cho JSR-310, như có thể thấy trên kho GitHub được liên kết với http://www.threeten.org/ . Nhân tiện, jodastephen cũng có một tay cầm SO ...

Tôi nghĩ an toàn khi tuyên bố rằng chúng ta có thể cảm thấy thoải mái và an toàn với API Ngày và Giờ mới như được cung cấp trong Java 8 trở đi.

Một số tài liệu tham khảo bổ sung:


12

API ngày tiêu chuẩn Java bị phá vỡ cơ bản đến mức tôi thường xem xét đơn giản là thêm Joda Time vào các phần mở rộng thư viện của JVM để nó được tải trên đường dẫn theo mặc định với phần còn lại của API Java.

Nếu bạn đã từng được giao nhiệm vụ trang bị thêm quốc tế hóa và múi giờ vào một ứng dụng Java cũ và đã cố gắng sử dụng API Java tiêu chuẩn, bạn sẽ hiểu ý tôi là gì. Tôi đã có thể biến hàng ngàn dòng mã asinine thành ít hơn một trăm. Việc tăng năng suất là không thể tưởng tượng được.

Hơn nữa, API ngày tiêu chuẩn không trực quan, trong đó API Joda lỏng có thể được chọn trong vài giờ chứ không phải vài tuần. tương tự của bạn cố gắng để có được đến hòn đảo đó là hai dặm, là hơn giống như sau.

1) Một chiếc thuyền máy sẽ đưa bạn đến đảo chỉ trong 6 phút.

Hoặc là...

2) Một chiếc bè tre tạm thời được buộc lại bằng dây leo trong cơn bão được điều khiển bởi một kẻ điên có người bạn thân nhất là một quả bóng chuyền.

Như các câu trả lời khác đã nêu, một số nhược điểm như ORM thậm chí còn không tồn tại vì Hibernate hiện có các plugin cho phép các thuộc tính bean loại Joda được ánh xạ tới các trường ngày / giờ của cơ sở dữ liệu. JPA cũng có thể có câu trả lời cho điều này là tốt.

Nếu mong muốn của bạn là ứng dụng của bạn có một dấu chân tối giản như một ứng dụng máy tính để bàn vì nó liên quan đến không gian đĩa thì có lẽ Java thậm chí không phải là lựa chọn ngôn ngữ phù hợp.


FYI, dự án Joda-Time hiện đang ở chế độ bảo trì , với nhóm tư vấn di chuyển đến các lớp java.time . Xem Hướng dẫn của Oracle .
Basil Bourque

8

Một điểm nữa: Thời gian Java (tức là Date) không phải là ThreadSafe mà là JodaTime. Vì vậy, JodaTime được ưa thích khi các yêu cầu như

  • Môi trường MultiThreaded truy cập các tài nguyên chung
  • Đồng bộ hóa thời gian tập trung như tình huống

Hoặc khác cho các ứng dụng đơn giản Java-Time là được.


Ngay cả DateTime cũng không phải là ThreadSafe, phải không? Sửa tôi nếu tôi đi sai.
vintesh 18/03/13

3
Phần lớn thư viện Joda, bao gồm cả lớp DateTime, là bất biến và do đó an toàn cho chuỗi. Tuy nhiên, có một vài lớp có thể thay đổi mà không an toàn cho luồng. Xem joda-time.sourceforge.net/faq.html#threading .
Robert Johnson

1
An toàn chủ đề cho java.timeđược thực hiện thông qua sự bất biến. Xem stackoverflow.com/questions/9303532/ cấp . Điều này hoạt động tốt cho cả các ứng dụng đơn giản và phức tạp. Ngay cả tài liệu api cũng nói rằng "Tất cả các lớp là bất biến và an toàn luồng" (được trích dẫn từ đoạn thứ hai). Mặt khác, java.utilcác lớp cũ có một số vấn đề. Tôi nhận ra rằng câu trả lời này đề cập đến cái sau, nhưng điều quan trọng là tạo ra sự khác biệt đó ngay bây giờ.
YoYo

Không đại diện cho thời gian ngày vì giá trị bất biến chỉ là điên rồ. Tôi biết bây giờ nó đã được sửa nhưng thực sự họ đang nghĩ gì trên thế giới?
Aluan Haddad

2

Các java.time khuôn khổ thay thế cả lớp ngày thời gian di sản và Joda thời gian

Cập nhật: Các lớp thời gian ngày cũ được phân phối với các phiên bản Java sớm nhất hiện đang được kế thừa, chính thức được thay thế bởi các lớp java.time được tích hợp trong Java 8, Java 9 và sau đó.

Date, Calendar, SimpleDateFormat, Và các java.sql.*lớp học ngày thời gian nên tất cả phải tránh. Không bao giờ có nhu cầu sử dụng các lớp học rắc rối, rắc rối, được thiết kế kém này. Chúng hoàn toàn được thay thế bởi các lớp java.time. Mục đích duy nhất của họ bây giờ là duy trì mã cũ hiện có. Khi giao tiếp với mã cũ, bạn có thể chuyển đổi sang / từ java.time bằng cách gọi các phương thức mới được thêm vào các lớp cũ. Để biết thêm thông tin về việc chuyển đổi, hãy xem: Chuyển đổi java.util.Date sang loại java java.time nào? .

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp. Dự án Joda-Time đã truyền cảm hứng cho khung java.time. Cả hai được dẫn dắt bởi cùng một người đàn ông, Stephen Colebourne . Bạn có thể nghĩ về java.time như là một bản viết lại / thiết kế lại của Joda-Time, tất cả các mã mới nhưng sử dụng những gì đã học được trong nhiều năm từ việc xây dựng thư viện thời gian toàn diện và tinh vi đầu tiên của ngành.

Để tìm hiểu thêm, xem Hướng dẫn của Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích.

Phần lớn chức năng java.time được chuyển ngược lại sang Java 6 & 7 trong ThreeTen-Backport và được điều chỉnh thêm cho Android trong ThreeTenABP (xem Cách sử dụng Thẻ ).

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho các bổ sung có thể trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval, YearWeek, YearQuarter, và nhiều hơn nữa .

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.