1. Datelớ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 Datelớ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 Datelớp học tốt như vậy? sự đơn giản của nó.

Lớp Datelư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 longloại được sử dụng để lưu trữ chúng.

Hấp dẫn.

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 Datelớ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, currentbiế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
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Đâ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 ý:

  1. Năm phải được tính từ năm 1900.
  2. Các tháng được đánh số từ số không.
Hấp dẫn.

Đâ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
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

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
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

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ả
int getYear()
Trả về năm của ngày so với năm 1900.
int getMonth()
Trả về tháng của ngày (các tháng được đánh số từ 0)
int getDate()
Trả về ngày trong tháng
int getDay()
Trả về ngày trong tuần
int getHours()
Trả về giờ
int getMinutes()
Trả về số phút
int getSeconds()
Trả về giây

Ví dụ:

Mã số Đầu ra bảng điều khiển Ghi chú
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

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 date2là sau date1, thì ...


7. DateFormatlớ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ố
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Đầu ra bảng điều khiển
Jun-04-2005

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ị Datechí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.parsephương pháp

Lớp Datecó 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.