1. Chuyển từ Datelớp này sang Calendarlớp khác

Các lập trình viên yêu thích Datelớp học này vì tính đơn giản và hỗ trợ các tiêu chuẩn Unix, nhưng như bạn biết đấy, bông hồng nào cũng có gai.

Các lập trình viên muốn có một lớp học "thông minh" Date. Và họ đã có được những gì họ muốn dưới hình thức lớp Calendarhọc. Nó được hình thành như một cách để không chỉ lưu trữ ngày tháng mà còn để thực hiện các thao tác khó với ngày tháng.

Tên đầy đủ của Calendarlớp là java.util.Calendar. Đừng quên thêm nó vào câu lệnh nhập nếu bạn quyết định sử dụng nó trong mã của mình.

Bạn có thể tạo một Calendarđối tượng bằng lệnh này:

Calendar date = Calendar.getInstance();

Phương thức tĩnh getInstance()của Calendarlớp tạo một Calendarđối tượng được khởi tạo với ngày hiện tại. Lịch bạn muốn sẽ được tạo dựa trên cài đặt của máy tính chạy chương trình.

Hay chính xác hơn, lịch bạn nhận được... Đó là bởi vì con người trên Trái đất không bị giới hạn trong một lịch duy nhất. Thay vào đó, họ sử dụng nhiều. Và hầu hết mọi người trong số họ đều gắn liền với một tôn giáo hoặc quốc gia nào đó. Lớp Calendarhỗ trợ 3 trong số đó:

Lịch Sự miêu tả
GregorianLịch Lịch Gregorian Kitô giáo
Phật GiáoLịch Phật lịch
Nhật BảnĐế QuốcLịch lịch hoàng gia nhật bản

Nhưng cũng có lịch Trung Quốc và Ả Rập. Về cơ bản, làm việc với thời gian không dễ dàng như người ta tưởng.

Trong lịch Trung Quốc, năm chính thức là năm 4716 tại thời điểm viết bài học này. Và theo lịch Hồi giáo, năm đó là năm 1398. Chào mừng đến với thế giới rộng lớn, người bạn lập trình viên của tôi.

2. Tạo đối tượng lịch

Chúng tôi sẽ sử dụng lịch Gregorian, vì nó là lịch phổ biến nhất trên thế giới. Ít nhất là cho đến khi Trung Quốc mua Oracle và biến lịch Trung Quốc thành lịch chính.

Bạn có thể tạo một đối tượng lịch với bất kỳ ngày nào bằng cách sử dụng câu lệnh như sau:

Calendar date = new GregorianCalendar(year, month, day);

Vâng, bạn phải viết GregorianCalendarmọi lúc. Thay vì Calendar, bạn cũng có thể viết GregorianCalendar— điều đó cũng sẽ hiệu quả. Nhưng viết just Calendarthì ngắn hơn.

Năm phải được viết đầy đủ, ví dụ: bạn không thể viết 19 thay vì 2019. Các tháng vẫn được đánh số từ 0. Nhưng cũng như trước đây, các ngày trong tháng không được đánh số từ số không. Mọt sách!

Để đặt thời gian cũng như ngày, bạn cần chuyển thời gian dưới dạng đối số bổ sung:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

Bạn thậm chí có thể vượt qua tính bằng mili giây nếu cần. Chúng là tham số sau số giây.

3. Hiển thị đối tượng lịch trên màn hình

Nếu bạn chỉ in một đối tượng lịch trên màn hình, bạn sẽ không hài lòng lắm với kết quả.

Mã số
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Đầu ra bảng điều khiển
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

Điều cần lưu ý ở đây là lịch là lịch, không phải ngày : nó có tất cả các loại cài đặt sẽ được hiển thị trên màn hình.

Sẽ là phù hợp nếu sử dụng một SimpleDateFormatđối tượng để hiển thị lịch, nhưng bạn có thể sử dụng thủ thuật cuộc sống này cho đến khi chúng tôi nghiên cứu về nó.

Date date = calendar.getTime();

Một Calendarđối tượng có thể dễ dàng chuyển đổi thành một Dateđối tượng và bạn đã biết cách hiển thị một Dateđối tượng. Bạn có thể sử dụng mã như thế này để chuyển đổi một Calendarđối tượng thành Date:

Sử dụng getTime()phương pháp:

Mã số Đầu ra bảng điều khiển
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Đó là một vấn đề hoàn toàn khác, phải không?

4. Làm việc với các phần tử của ngày tháng

Để lấy một phần tử cụ thể của một ngày (ví dụ: năm, tháng, ...), lớp Calendarget()phương thức. Đó là một phương thức duy nhất, nhưng nó có các tham số:

int month = calendar.get(Calendar.MONTH);

Đâu calendarlà một Calendarbiến, và MONTHlà một trường hằng của Calendarlớp.

Bạn chuyển một trong Calendarcác trường hằng số của lớp làm đối số cho getphương thức và kết quả là bạn nhận được giá trị mong muốn.

ví dụ

Mã số Sự miêu tả
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


kỷ nguyên (trước hoặc sau kỷ nguyên chung)
năm
tháng
ngày trong tháng

ngày trong tuần
giờ
phút
giây

Để thay đổi một phần tử của ngày, hãy sử dụng setphương thức:

calendar.set(Calendar.MONTH, value);

Đâu calendarlà một Calendarbiến, và MONTHlà một trường hằng của Calendarlớp.

Khi làm việc với setphương thức, bạn chuyển một trong Calendarcác trường hằng số của lớp làm đối số đầu tiên và giá trị mới làm đối số thứ hai.

ví dụ

Mã số Sự miêu tả
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


năm = 2019
tháng = tháng 7 (đánh số từ 0)
ngày thứ 4
giờ
phút
giây

5. Hằng của Calendarlớp

Các trường hằng số của Calendarlớp không bị giới hạn đối với các trường để đặt tên các phần tử của một ngày tháng. Dường như có các lĩnh vực cho mọi dịp.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

Ví dụ: có các trường cố định để chỉ các tháng:

Và cả những ngày trong tuần:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

Chúng tôi sẽ không liệt kê tất cả mọi thứ. Chúng tôi chỉ không muốn bạn ngạc nhiên nếu thấy các hằng số như thế này trong mã.

Sử dụng các hằng số làm cho mã dễ đọc hơn, đó là lý do tại sao các lập trình viên sử dụng chúng. Và các tháng cũng được đánh số từ 0 để cải thiện khả năng đọc. Hay không.

6. Thay đổi ngày trong Calendarđối tượng

Lớp này Calendarcó một phương thức cho phép bạn thao tác vào một ngày theo những cách thông minh hơn. Ví dụ: bạn có thể thêm một năm, một tháng hoặc vài ngày vào một ngày. Hoặc lấy đi chúng đi. Phương pháp này được gọi là add(). Làm việc với nó trông như thế này:

calendar.add(Calendar.MONTH, value);

Đâu calendarlà một Calendarbiến, và MONTHlà một trường hằng của Calendarlớp.

Khi làm việc với addphương thức, bạn chuyển một trong Calendarcác trường hằng số của lớp làm đối số đầu tiên và làm đối số thứ hai — giá trị mới sẽ được thêm vào.

Đây là một phương pháp thông minh khác. Hãy xem nó thông minh như thế nào:

Mã số
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Đầu ra bảng điều khiển
Fri Mar 01 00:00:00 EET 2019

Phương pháp này hiểu rằng tháng 2 năm 2019 chỉ có 28 ngày nên ngày có kết quả là ngày 1 tháng 3.

Bây giờ chúng ta hãy lấy đi 2 tháng! Chúng ta nên lấy gì? Ngày 27 tháng 12 năm 2018! Hãy kiểm tra ngay bây giờ.

Để thực hiện một thao tác dẫn đến một ngày sớm hơn, bạn cần chuyển một giá trị âm cho phương add()thức:

Mã số
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Đầu ra bảng điều khiển
Thu Dec 27 00:00:00 EET 2018

Nó hoạt động!

Phương pháp này tính độ dài khác nhau của tháng cũng như năm nhuận. Tất cả trong tất cả, một phương pháp tuyệt vời. Đó chính xác là điều mà hầu hết các lập trình viên làm việc với ngày tháng cần.

7. Các yếu tố lăn của một ngày

Nhưng đôi khi có những tình huống chúng ta không muốn hành vi thông minh này, chẳng hạn như bạn muốn làm điều gì đó với một phần của ngày mà không thay đổi mọi thứ khác.

Lớp Calendarroll()phương pháp đặc biệt cho việc này. Chữ ký của nó giống như add()phương thức, nhưng phương thức này chỉ thay đổi một phần tử của ngày, phần còn lại không thay đổi.

Ví dụ:

Mã số
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Đầu ra bảng điều khiển
Fri Dec 27 00:00:00 EET 2019

Chúng tôi đã thay đổi tháng, nhưng năm và ngày vẫn không thay đổi.