1. 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 Calendar
xuấ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.time
là 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.format
chứ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 DateTimeFormatter
lớp linh hoạt, lớp này thay thế SimpleDateFormat
lớp.
Gói java.time.zone
chứa các lớp để làm việc với các múi giờ. Nó chứa các lớp như TimeZone
và ZonedDateTime
. 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. LocalDate
lớ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à LocalDate
lớ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 today
là một LocalDate
biến và LocalDate.now()
là một lời gọi đến phương thức tĩnh now()
của LocalDate
lớp.
Ví dụ:
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
Nhận một ngày trong một múi giờ cụ thể
Lớp này LocalDate
cũ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 — ZoneId
lớ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 |
---|---|
|
|
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 date
là một LocalDate
biế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 FEBRUARY
số của Month
lớ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 |
---|---|
|
|
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 ofYearDay
phươ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 year
là số của năm và day
là chỉ số của ngày trong năm.
Ví dụ:
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
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 Date
cá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 LocalDate
có 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 day
là 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 |
---|---|
|
|
4. Lấy các phần tử của một ngày
Không thể thay đổi LocalDate
cá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ữ. LocalDate
cá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ả |
---|---|
|
Trả về năm của một ngày cụ thể |
|
Trả về tháng của ngày: một trong nhiều hằng sốJANUARY, FEBRUARY, ...; |
|
Trả về chỉ số tháng của ngày. Tháng Giêng == 1. |
|
Trả về chỉ số của ngày trong tháng |
|
Trả về chỉ số của ngày từ đầu năm |
|
Trả về ngày trong tuần: một trong nhiều hằng sốMONDAY, TUESDAY, ...; |
|
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 |
---|---|
|
|
5. Thay đổi ngày trong LocalDate
đối tượng
Lớp này LocalDate
chứ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 String
lớ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 LocalDate
lớp:
Phương pháp | Sự miêu tả |
---|---|
|
Thêm một số ngày được chỉ định vào ngày |
|
Thêm tuần vào ngày |
|
Thêm tháng vào ngày |
|
Thêm năm vào ngày |
|
Trừ ngày kể từ ngày |
|
Trừ tuần kể từ ngày |
|
Trừ tháng kể từ ngày |
|
Trừ năm kể từ ngày |
Ví dụ:
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
Các birthday object
phươ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.
GO TO FULL VERSION