1. Giới thiệu API Ngày Giờ

Giới thiệu API ngày giờ

Những người tạo ra Java không thích tình huống với các lớp Ngày và Lịch. Họ đã tốt trong ngày của họ, nhưng thời gian thay đổi. Và một cái gì đó đơn giản, mạnh mẽ và đáng tin cậy trở nên cần thiết. Và với việc phát hành Java 8 (15 năm sau khi Calendarxuất hiện), Java Date Time API đã được giới thiệu. Nó là một tập hợp các lớp có thể giải quyết mọi nhiệm vụ có thể liên quan đến thời gian.

Có rất nhiều lớp nên chúng được chia thành nhiều gói:

Gói này java.timelà gói cơ sở cho API Ngày giờ Java: gói này chứa các lớp như LocalDate, LocalTime, LocalDateTime, Instant, Period, và Duration. Tất cả các đối tượng của các lớp này là immutable, có nghĩa là chúng không thể thay đổi sau khi tạo.

Gói java.time.formatchứa các lớp để định dạng thời gian, nghĩa là chuyển đổi thời gian (và ngày tháng) thành chuỗi và ngược lại. Ví dụ, nó chứa DateTimeFormatterlớp linh hoạt, lớp này thay thế SimpleDateFormatlớp.

Gói java.time.zonechứa các lớp để làm việc với các múi giờ. Nó chứa các lớp như TimeZoneZonedDateTime. Nếu bạn đang viết mã máy chủ cho các máy khách ở những nơi khác nhau trên thế giới, bạn sẽ thực sự cần những lớp này.


2. LocalDatelớp học

Lớp đầu tiên và hữu ích nhất từ ​​API Ngày Giờ mà chúng ta sẽ xem xét là lớp LocalDate. Như bạn có thể đoán từ tên của nó, lớp này được thiết kế để hoạt động với ngày tháng.

Các đối tượng của lớp này không thay đổi sau khi chúng được tạo, tức là LocalDatelớp là bất biến. Nhưng thuộc tính này thêm tính đơn giản và độ tin cậy cho lớp. Đặc biệt nếu một số luồng (luồng thực thi) đang tương tác với một đối tượng như vậy cùng một lúc.

Để tạo một LocalDateđối tượng mới, bạn cần sử dụng một trong các phương thức tĩnh. Dưới đây là danh sách những cái chính.

Lấy ngày hiện tại

Để có được ngày hiện tại, bạn cần sử dụng now()phương thức tĩnh. Điều này là dễ dàng hơn nhiều so với nó có vẻ:

LocalDate today = LocalDate.now();

Đâu todaylà một LocalDatebiến và LocalDate.now()là một lời gọi đến phương thức tĩnh now()của LocalDatelớp.

Ví dụ:

Mã số Đầu ra bảng điều khiển
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Nhận một ngày trong một múi giờ cụ thể

Lớp này LocalDatecũng có một biến thể của now(ZoneId)phương thức cho phép bạn lấy ngày hiện tại theo một múi giờ cụ thể.

Để làm điều này, chúng ta cần một lớp khác — ZoneIdlớp (java.time.ZoneId). Nó có một of()phương thức trả về một ZoneIdđối tượng được cung cấp tên của múi giờ.

Để xác định ngày hiện tại ở Thượng Hải, bạn cần viết đoạn mã sau:

Mã số Đầu ra bảng điều khiển
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Bạn có thể tìm thấy danh sách tên của tất cả các múi giờ trên Internet.


3. Lấy một ngày cụ thể

Để có được một LocalDateđối tượng đại diện cho một ngày cụ thể, bạn cần sử dụng of()phương thức tĩnh. Mọi thứ ở đây cũng rất đơn giản và rõ ràng:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Đâu datelà một LocalDatebiến và là một lời gọi đến phương thức tĩnh của lớp.LocalDate.of()of()LocalDate

Ở đây chúng ta thấy hằng FEBRUARYsố của Monthlớp (java.time.Month) được sử dụng để chỉ định tháng Hai là tháng.

Bạn cũng có thể chỉ định tháng theo cách cũ — sử dụng một số:

LocalDate date = LocalDate.of(2019, 2, 22);

Hai? Thay vì tháng hai? Điều đó có nghĩa là các tháng một lần nữa được đánh số từ một?

Vâng, gần 20 năm sau khi Java được tạo ra, các tháng cuối cùng đã không còn được đánh số từ con số không.

Ví dụ:

Mã số Đầu ra bảng điều khiển
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Nhận một ngày theo chỉ số trong ngày

Có một cách thú vị khác để tạo ngày: sử dụng ofYearDayphương pháp này, bạn có thể nhận được ngày chỉ dựa trên số của năm và chỉ số của ngày trong năm. Đây là diện mạo chung:

LocalDate date = LocalDate.ofYearDay(year, day);

Đâu yearlà số của năm và daylà chỉ số của ngày trong năm.

Ví dụ:

Mã số Đầu ra bảng điều khiển
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

Ngày thứ 100 của năm 2019 là ngày 10 tháng 4.

Nhận một ngày Unix

Bạn có nhớ rằng Datecác đối tượng luôn lưu trữ thời gian dưới dạng số mili giây kể từ ngày 1 tháng 1 năm 1970 không? Để đảm bảo các lập trình viên không bỏ lỡ những ngày xưa tốt đẹp, lớp LocalDatecó một ofEpochDay()phương thức trả về ngày được tính từ ngày 1 tháng 1 năm 1970. Đây là giao diện chung:

LocalDate date = LocalDate.ofEpochDay(day);

Đâu daylà số ngày đã trôi qua kể từ ngày 1 tháng 1 năm 1970.

Ví dụ:

Mã số Đầu ra bảng điều khiển
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Lấy các phần tử của một ngày

Không thể thay đổi LocalDatecác đối tượng, nhưng bạn có thể lấy các phần tử riêng lẻ của ngày được lưu trữ. LocalDatecác đối tượng có một số phương pháp cho việc này:

Phương pháp Sự miêu tả
int getYear()
Trả về năm của một ngày cụ thể
Month getMonth()
Trả về tháng của ngày: một trong nhiều hằng số
JANUARY, FEBRUARY, ...;
int getMonthValue()
Trả về chỉ số tháng của ngày. Tháng Giêng == 1.
int getDayOfMonth()
Trả về chỉ số của ngày trong tháng
int getDayOfYear()
Trả về chỉ số của ngày từ đầu năm
DayOfWeek getDayOfWeek()
Trả về ngày trong tuần: một trong nhiều hằng số
MONDAY, TUESDAY, ...;
IsoEra getEra()
Trả về thời đại: hoặc BCE(Trước thời đại hiện tại) và CE(Thời đại hiện tại)

Ví dụ:

Mã số Đầu ra bảng điều khiển
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Thay đổi ngày trong LocalDateđối tượng

Lớp này LocalDatechứa một số phương thức cho phép bạn làm việc với ngày tháng. Việc triển khai các phương thức này tương tự như các phương thức của Stringlớp: chúng không thay đổi LocalDateđối tượng hiện có mà trả về một đối tượng mới với dữ liệu mong muốn.

Dưới đây là các phương thức của LocalDatelớp:

Phương pháp Sự miêu tả
plusDays(int days)
Thêm một số ngày được chỉ định vào ngày
plusWeeks(int weeks)
Thêm tuần vào ngày
plusMonths(int months)
Thêm tháng vào ngày
plusYears(int years)
Thêm năm vào ngày
minusDays(int days)
Trừ ngày kể từ ngày
minusWeeks(int weeks)
Trừ tuần kể từ ngày
minusMonths(int months)
Trừ tháng kể từ ngày
minusYears(int years)
Trừ năm kể từ ngày

Ví dụ:

Mã số Đầu ra bảng điều khiển
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Các birthday objectphương thức mà chúng ta gọi không thay đổi. Thay vào đó, các phương thức của nó trả về các đối tượng mới chứa dữ liệu mong muốn.