1. Преминаване от Dateклас в Calendarклас

Програмистите харесаха Dateкласа заради неговата простота и поддръжка на Unix стандартите, но Howто знаете, всяка роза има своите бодли.

Програмистите искаха "умен" Dateклас. И те получиха това, което искаха под формата на Calendarкласа. Той е замислен като начин не само да съхранява дати, но и да извършва трудни операции с дати.

Пълното име на Calendarкласа е java.util.Calendar. Не забравяйте да го добавите към оператор за импортиране, ако решите да го използвате във вашия code.

Можете да създадете Calendarобект с тази команда:

Calendar date = Calendar.getInstance();

Статичният getInstance()метод на Calendarкласа създава Calendarобект, инициализиран с текущата дата. Желаният от вас календар ще бъде създаден въз основа на настройките на компютъра, на който се изпълнява програмата.

Или по-точно, календарът, който получавате... Това е така, защото хората на Земята не са ограничени до един календар. Вместо това те използват много. И почти всеки от тях е свързан с няHowва религия or държава. Класът Calendarподдържа 3 от тях:

Календар Описание
Грегориански календар Християнски григориански календар
будистки календар будистки календар
Японски имперски календар Японски императорски календар

Но има и китайски и арабски календари. По принцип работата с времето не е толкова лесна, колкото изглежда.

В китайския календар годината официално е 4716 към момента на писане на този урок. А според мюсюлманския календар годината е 1398. Добре дошъл в големия свят, приятелю програмист.

2. Създаване на календарен обект

Ще използваме григорианския календар, тъй като той е най-разпространеният в света. Поне докато Китай купи Oracle и не направи китайския календар основен.

Можете да създадете календарен обект с произволна дата, като използвате израз като този:

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

Да, трябва да пишете GregorianCalendarвсеки път. Вместо Calendar, можете също да пишете GregorianCalendar- това също ще работи. Но самото писане Calendarе по-кратко.

Годината трябва да бъде написана изцяло, например не можете да напишете 19 instead of 2019. Месеците все още се номерират от нула. Но Howто преди, дните в месеца не се номерират от нула. маниаци!

За да зададете часа, Howто и датата, трябва да подадете времето като допълнителни аргументи:

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

Можете дори да преминете за мorсекунди, ако е необходимо. Те са параметърът след броя секунди.

3. Показване на календарен обект на екрана

Ако просто отпечатате календарен обект на екрана, няма да сте много доволни от резултата.

Код
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Конзолен изход
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=?]

Нещото, което трябва да имате предвид тук е, че календарът е календар, а не дата : той има всяHowви настройки, които ще се показват на екрана.

Би било правилно да използвате SimpleDateFormatобект за показване на календар, но докато не го проучим, можете да използвате този лайфхак.

Date date = calendar.getTime();

Един Calendarобект може лесно да бъде преобразуван в Dateобект и вие вече знаете How да показвате Dateобект. Можете да използвате code като този, за да конвертирате Calendarобект в Date:

Използване на getTime()метода:

Код Конзолен изход
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Това е съвсем различен въпрос, нали?

4. Работа с елементи на дата

За да получите конкретен елемент от дата (например година, месец, ...), класът Calendarима get()метода. Това е един метод, но има параметри:

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

Където calendarе Calendarпроменлива, а MONTHе константно поле на Calendarкласа.

Подавате едно от Calendarконстантните полета на класа като аргумент на getметода и получавате желаната стойност като резултат.

Примери

Код Описание
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);


ера (преди or след общата ера)
година
месец
ден от месеца

ден от седмицата
часове
minutesи
секунди

За да промените елемент от дата, използвайте setметода:

calendar.set(Calendar.MONTH, value);

Където calendarе Calendarпроменлива, а MONTHе константно поле на Calendarкласа.

Когато работите с setметод, предавате едно от Calendarпостоянните полета на класа като първи аргумент и новата стойност като втори аргумент.

Примери

Код Описание
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());


година = 2019
месец = юли (номериран от 0)
4-ти ден
часове
minutesи
секунди

5. Константи на Calendarкласа

Константните полета на Calendarкласа не се ограничават до тези за именуване на елементи от дата. Изглежда, че има полета за всеки повод.

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

Например има постоянни полета за позоваване на месеци:

А също и дните от седмицата:

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

Няма да изброяваме всичко. Просто не искаме да бъдете изненадани, ако видите константи като тази в codeа.

Използването на константи прави codeа по-четлив, поради което програмистите ги използват. Месеците също са номерирани от нула, за да се подобри четливостта. Или не.

6. Смяна на дата в Calendarобект

Класът Calendarима метод, който ви позволява да оперирате с дата по по-интелигентни начини. Например, можете да добавите година, месец or няколко дни към дата. Или ги махнете. Този метод се нарича add(). Работата с него изглежда така:

calendar.add(Calendar.MONTH, value);

Където calendarе Calendarпроменлива, а MONTHе константно поле на Calendarкласа.

Когато работите с addметод, вие предавате едно от Calendarконстантните полета на класа като първи аргумент, а като втори аргумент — новата стойност, която трябва да бъде добавена.

Това е друг интелигентен метод. Да видим колко е умен:

Код
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Конзолен изход
Fri Mar 01 00:00:00 EET 2019

Този метод разбира, че има само 28 дни през февруари 2019 г., така че получената дата е 1 март.

Сега да вземем 2 месеца! Какво трябва да получим? 27 декември 2018 г.! Да проверим сега.

За да извършите операция, която води до по-ранна дата, трябва да подадете отрицателна стойност към add()метода:

Код
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Конзолен изход
Thu Dec 27 00:00:00 EET 2018

Работи!

Този метод отчита различната продължителност на месеците, Howто и високосните години. Като цяло страхотен метод. Това е точно това, от което се нуждаят повечето програмисти, които работят с дати.

7. Подвижни елементи на дата

Но понякога има ситуации, когато не искаме това умно поведение, например искате да направите нещо за една част от датата, без да променяте всичко останало.

Класът Calendarима специален roll()метод за това. Неговият подпис е точно като add()метода, но този метод променя само един елемент от датата, оставяйки останалите непроменени.

Пример:

Код
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Конзолен изход
Fri Dec 27 00:00:00 EET 2019

Променихме месеца, но годината и датата останаха непроменени.