Java cuối cùng cũng có một cách trực quan, đáng tin cậy để làm việc với ngày và giờ. Các nguyên tắc về ngày và giờ là nền tảng trong nhiều ứng dụng. Nhiều thứ khác nhau như ngày sinh, ngày thuê, thời gian sự kiện và giờ mở cửa cửa hàng đều dựa trên ngày và giờ, nhưng Java SE không cung cấp cách thuận tiện để làm việc với chúng. Bắt đầu với Java SE 8 , đã có một bộ gói java.time - cung cấp API có cấu trúc tốt để làm việc với ngày và giờ.
Dưới đây là một danh sách nhỏ các vấn đề hiện có trong quá trình triển khai:
Lý lịch
Khi Java lần đầu tiên xuất hiện, trong phiên bản 1.0 , lớp duy nhất để làm việc với ngày và giờ là java.util.Date . Điều đầu tiên các nhà phát triển nhận thấy là nó không đại diện cho “ngày tháng”. Trên thực tế, nó đại diện cho một khoảnh khắc, chính xác đến từng mili giây, được tính từ ngày 1 tháng 1 năm 1970. Tuy nhiên, dựa trên thực tế là phương thức toString() của Date hiển thị ngày và giờ theo múi giờ được chỉ định trong cài đặt java của máy , một số nhà phát triển đã kết luận nhầm rằng Date có thể hoạt động với các múi giờ. Việc sửa lớp này hóa ra khó đến mức (hoặc lười biếng đến mức trong phiên bản 1.1 chúng tôi phải thêm một lớp mới - java.util.Calendar . Thật không may, lớp Calendar hóa ra không tốt hơn Date là mấy .- Có thể thay đổi. Các lớp như ngày và giờ phải không thay đổi được.
- Bù đắp. Năm trong Ngày bắt đầu từ năm 1900, các tháng ở cả hai lớp đều bắt đầu từ số 0.
- Tên. Ngày thực tế không phải là "ngày" và Lịch không phải là lịch.
- Định dạng. Định dạng chỉ hoạt động với Ngày chứ không phải Lịch và không an toàn cho chuỗi.
Ôn tập
API java.time mới chứa 5 gói:- java.time - gói cơ sở chứa các đối tượng để lưu trữ giá trị
- java.time.chrono - cung cấp quyền truy cập vào các lịch khác nhau
- java.time.format - định dạng và nhận dạng ngày giờ
- java.time.temporal - thư viện cấp thấp và chức năng nâng cao
- java.time.zone - các lớp làm việc với múi giờ
ngày
Lớp LocalDate là một trong những lớp quan trọng nhất trong API mới . Nó chứa một giá trị bất biến đại diện cho một ngày. Bạn không thể đặt thời gian hoặc múi giờ. Tên "local" có thể quen thuộc với bạn từ Joda-Time và ban đầu xuất phát từ tiêu chuẩn ISO-8601 . Nó có nghĩa chính xác là không có múi giờ. Về cơ bản, LocalDate là mô tả về một ngày, chẳng hạn như "ngày 5 tháng 4 năm 2014". Thời gian thực tế của ngày này sẽ khác nhau tùy thuộc vào múi giờ của bạn. Ví dụ: ở Úc ngày này sẽ sớm hơn 10 giờ so với ở London và sớm hơn 18 giờ so với ở San Francisco. Lớp LocalDate có tất cả các phương thức thường cần:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
Trong ví dụ của chúng tôi, chúng tôi thấy một ngày được tạo bằng phương thức xuất xưởng (tất cả các hàm tạo đều là riêng tư). Tiếp theo chúng ta yêu cầu đối tượng cung cấp một số dữ liệu. Xin lưu ý rằng bảng liệt kê
Tháng và
Ngày trong tuần được thiết kế để làm cho mã dễ đọc và đáng tin cậy hơn. Trong ví dụ sau chúng ta sẽ xem cách sửa đổi ngày. Vì lớp này là bất biến nên kết quả sẽ là các đối tượng mới, nhưng đối tượng ban đầu sẽ vẫn như cũ.
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
Đây là những thay đổi tương đối đơn giản nhưng bạn thường cần thực hiện những sửa đổi ngày phức tạp hơn. Có một cơ chế đặc biệt cho việc này trong
API java.time - TemporalAdjuster . Mục đích của nó là cung cấp một công cụ tích hợp cho phép bạn thao tác ngày tháng, ví dụ như lấy một đối tượng tương ứng với ngày cuối cùng của tháng. Một số trong số chúng được bao gồm trong
API nhưng bạn có thể thêm API của riêng mình. Sử dụng công cụ sửa đổi rất dễ dàng, nhưng nó yêu cầu nhập tĩnh:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
Việc sử dụng công cụ sửa đổi giúp đơn giản hóa mã của bạn rất nhiều. Không ai muốn thấy nhiều thao tác ngày tháng thủ công. Nếu một số loại thao tác ngày tháng xảy ra nhiều lần trong dự án của bạn, hãy viết công cụ sửa đổi của riêng bạn và nhóm của bạn có thể sử dụng nó như một thành phần đã được viết và thử nghiệm.
GO TO FULL VERSION