1. Date
lớp học và thời gian Unix
Ngay từ những ngày đầu của Java, ngôn ngữ này đã có một lớp đặc biệt để làm việc với thời gian và ngày tháng — Date
. Theo thời gian, một số lớp khác để làm việc với ngày tháng đã xuất hiện, nhưng các lập trình viên vẫn tiếp tục sử dụng Date
lớp này cho đến tận ngày nay.
Điều này là do nó rất đơn giản và thuận tiện. Và là một lập trình viên, chắc chắn bạn sẽ bắt gặp nó trong bất kỳ dự án thực tế nào. Sử dụng hay không là quyền của bạn, nhưng bạn phải biết điều đó. Vì vậy, hãy cho nó một vài phút thời gian quý báu của bạn.
Điều gì làm cho Date
lớp học tốt như vậy? sự đơn giản của nó.
Lớp Date
lưu trữ thông tin ngày và giờ dưới dạng số mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970. Đó là rất nhiều mili giây, vì vậy long
loại được sử dụng để lưu trữ chúng.
Tại sao từ năm 1970 cụ thể? Đây được gọi là thời gian Unix : đó là cách hệ điều hành Unix, ông tổ của tất cả các hệ điều hành hiện đại, lưu giữ thời gian.
Nhưng bạn có thể dễ dàng tìm ra khoảng thời gian đã trôi qua giữa hai ngày: chỉ cần trừ ngày này với ngày kia và bạn sẽ nhận được chênh lệch múi giờ giữa các ngày chính xác đến mili giây.
Dưới đây là một số ví dụ hữu ích về cách làm việc với Date
lớp học.
2. Lấy ngày hiện tại
Để có được thời gian và ngày hiện tại, chỉ cần tạo một Date
đối tượng. Mỗi đối tượng mới lưu trữ thời gian khi nó được tạo. Nó trông rất đơn giản:
Date current = new Date();
Sau khi thực hiện lệnh này, current
biến sẽ lưu một tham chiếu đến Date
đối tượng đã tạo, tham chiếu này sẽ lưu trữ bên trong thời gian tạo đối tượng — số mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970.
Hiển thị ngày hiện tại trên màn hình
Để hiển thị ngày hiện tại, chỉ cần: a) tạo một Date
đối tượng mới, b) in nó ra màn hình bằng System.out.println()
phương thức.
Ví dụ:
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
Đây là ý nghĩa của đầu ra giao diện điều khiển:
Chữ | Diễn dịch |
---|---|
thứ năm | Thứ năm |
21 tháng hai | ngày 21 tháng 2 |
14:01:34 | giờ : phút : giây |
EET | Múi giờ: Giờ Đông Âu |
2019 | Năm |
3. Đặt ngày cụ thể
Chúng tôi đã tìm ra cách lấy thời gian hiện tại, nhưng làm cách nào để tạo một Date
đối tượng lưu trữ ngày hoặc giờ khác?
Một lần nữa, mọi thứ đều đơn giản ở đây. Để đặt một ngày cụ thể, bạn cần viết mã như sau:
Date birthday = new Date(year, month, day);
Mọi thứ đều đơn giản và rõ ràng, nhưng có hai sắc thái cần lưu ý:
- Năm phải được tính từ năm 1900.
- Các tháng được đánh số từ số không.
Đây là một di sản khác của hệ điều hành Unix: trên Unix, các lập trình viên biểu thị năm bằng hai chữ số. Thay vì 1977, họ chỉ viết 77. Vì vậy, 77 là năm chính xác nếu chúng ta tính từ 1900.
Ví dụ tôi sinh ngày 21 tháng 3 năm 1989. Tháng 3 là tháng thứ ba nên tôi cần viết:
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
Tháng được đánh số từ 0, nhưng ngày thì không. Điều đó hơi lạ đúng không?
Chúng tôi nghĩ rằng các lập trình viên chân chính cũng nên chiếm ưu thế và đánh số các ngày trong tháng từ con số không. Ồ, những người tuân thủ này 🙂
Đặt thời gian cụ thể
Đặt thời gian cụ thể cũng khá đơn giản: để làm được điều này, bạn cần viết một câu lệnh như sau:
Date birthday = new Date(year, month, day, hour, minutes, seconds);
Giờ, phút và giây được đánh số từ 0: hãy để lập trình viên bên trong bạn thở phào nhẹ nhõm.
Ví dụ:
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
Chúng tôi đặt thời gian 12:15 và ngày 4 tháng 6 năm 2005 . Điều này hơi khó đọc đối với người không phải là lập trình viên, nhưng nó hoạt động như bình thường.
4. Làm việc với các phần tử của ngày tháng
Bạn có thể làm nhiều việc hơn với một Date
đối tượng hơn là chỉ hiển thị nó. Nó có các phương thức cho phép bạn lấy các phần tử riêng lẻ của ngày được lưu trữ nội bộ:
Phương pháp | Sự miêu tả |
---|---|
|
Trả về năm của ngày so với năm 1900. |
|
Trả về tháng của ngày (các tháng được đánh số từ 0) |
|
Trả về ngày trong tháng |
|
Trả về ngày trong tuần |
|
Trả về giờ |
|
Trả về số phút |
|
Trả về giây |
Ví dụ:
Mã số | Đầu ra bảng điều khiển | Ghi chú |
---|---|---|
|
|
Tháng sáu 2005 ngày thứ bảy |
Nhân tiện, một Date
đối tượng không chỉ cho phép bạn nhận các phần tử riêng lẻ của một ngày mà còn thay đổi chúng:
Phương pháp | Sự miêu tả |
---|---|
void setYear(int year) |
Thay đổi năm của ngày. Năm được chỉ định so với năm 1900. |
void setMonth(int month) |
Thay đổi tháng của ngày (tháng được đánh số từ 0) |
void setDate(int date) |
Thay đổi ngày trong tháng |
void setHours(int hours) |
Thay đổi giờ |
void setMinutes(int minutes) |
Thay đổi phút |
void setSeconds(int seconds) |
Thay đổi giây |
5. Phần nghìn giây
Như chúng tôi đã nói trước đây, Date
đối tượng lưu trữ số mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970.
Nếu chúng ta cần số đó, chúng ta có thể lấy nó từ Date
đối tượng:
long time = date.getTime();
Phương getTime()
thức trả về số mili giây được lưu trữ bên trong Date
đối tượng.
Bạn không chỉ có thể lấy số mili giây mà còn có thể thay đổi số đó trong một đối tượng hiện có:
Date date = new Date();
date.setTime(1117876500000L);
Nhân tiện, bạn có thể viết điều này thậm chí ngắn gọn hơn bằng cách chuyển thời gian cho Date
đối tượng ngay khi nó được tạo:
Date date = new Date(1117876500000L);
6. So sánh ngày tháng
Nếu bạn muốn so sánh hai ngày và tìm xem ngày nào có trước, bạn có ba tùy chọn
Cách đầu tiên là chỉ cần so sánh số mili giây mà chúng lưu trữ:
if (date1.getTime() < date2.getTime())
Cách thứ hai là sử dụng before()
phương thức của một Date
đối tượng:
if (date1.before(date2))
Nó đọc như thế này: nếu date1
đến trước date2
, thì ...
Cách thứ ba là sử dụng after()
phương thức của một Date
đối tượng:
if (date2.after(date1))
Nó đọc như thế này: nếu date2
là sau date1
, thì ...
7. DateFormat
lớp học
Hãy nhớ rằng, khi chúng tôi hiển thị ngày trên màn hình, chúng tôi đã thấy một cái gì đó như thế này: Thu Feb 21 14:01:34 EET 2019
. Mọi thứ có vẻ đúng, nhưng định dạng là cách hiển thị ngày cho các lập trình viên hơn là người bình thường. Chúng tôi muốn hiển thị ngày rõ ràng hơn cho người dùng. Một cái gì đó như Tuesday, February 21
.
Và không có năm. Hoặc với một năm, nếu cần thiết. Nói chung, chúng tôi muốn có thể hiển thị ngày theo nhiều cách khác nhau.
Có một lớp đặc biệt cho việc này: SimpleDateFormat
.
Ví dụ:
Mã số |
---|
|
Đầu ra bảng điều khiển |
|
Nhìn vào những gì chương trình hiển thị: Jun-04-2005
. Đó không phải là tất cả những gì nó từng là.
Sự khác biệt là chúng tôi không hiển thị Date
chính đối tượng đó, mà là một chuỗi đặc biệt thu được bằng cách gọi format()
phương thức trên một SimpleDateFormat
đối tượng. Nhưng đó thậm chí không phải là điểm chính ở đây.
Khi SimpleDateFormat
đối tượng được tạo, chúng tôi đã chuyển vào chuỗi "MMM-dd-YYYY"
dưới dạng tham số. Chuỗi này truyền tải định dạng ngày mà cuối cùng chúng ta đã thấy trong đầu ra của bảng điều khiển.
- MMM cho biết hiển thị tên của tháng, được viết tắt bằng ba chữ cái
- dd chỉ ra để hiển thị ngày trong tháng
- YYYY chỉ ra để hiển thị năm sử dụng bốn chữ số
Nếu chúng ta muốn xuất tháng dưới dạng số, thì thay vì MMM
, chúng ta cần viết MM
, điều này mang lại mẫu "MM-dd-YYYY"
. Đầu ra màn hình sẽ là06-04-2005
Chúng ta sẽ thảo luận chi tiết hơn về lớp này sau.
8. Date.parse
phương pháp
Lớp Date
có thể làm điều gì đó thú vị và hữu ích khác — nó có thể lấy ngày từ một chuỗi. Hoặc, như các lập trình viên nói, nó có thể phân tích cú pháp một chuỗi.
Nó có parse()
phương pháp đặc biệt cho việc này. Phân tích cú pháp trông như thế này:
Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );
Nhân tiện, mã này có thể được viết gọn hơn:
Date date = new Date("Jul 06 12:15:00 2019");
Chúng ta sẽ xem xét việc phân tích chuỗi chi tiết hơn trong các bài học khác.