1. Trecerea de la Dateclasă la Calendarclasă

Programatorii au iubit Dateclasa pentru simplitate și suport pentru standardele Unix, dar după cum știți, fiecare trandafir are spinii lui.

Programatorii doreau o Dateclasă „inteligentă”. Și au obținut ceea ce și-au dorit sub forma clasei Calendar. A fost conceput ca o modalitate nu numai de a stoca datele, ci și de a efectua operațiuni dificile cu datele.

Numele complet al Calendarclasei este java.util.Calendar. Nu uitați să îl adăugați la o instrucțiune de import dacă decideți să îl utilizați în cod.

Puteți crea un Calendarobiect cu această comandă:

Calendar date = Calendar.getInstance();

Metoda statică getInstance()a Calendarclasei creează un Calendarobiect inițializat cu data curentă. Calendarul dorit va fi creat pe baza setărilor computerului care rulează programul.

Sau mai exact, calendarul pe care îl primiți... Asta pentru că oamenii de pe Pământ nu sunt limitați la un singur calendar. În schimb, folosesc multe. Și aproape fiecare dintre ele este asociat cu o religie sau o țară. Clasa Calendarsprijină 3 dintre ele:

Calendar Descriere
Calendar gregorian Calendarul creștin gregorian
Calendarul budist Calendar budist
Calendarul Imperial Japonez Calendarul imperial japonez

Există însă și calendare chinezești și arabe. Practic, lucrul cu timpul nu este atât de ușor pe cât pare.

În calendarul chinezesc, anul este oficial 4716 la momentul scrierii acestei lecții. Și conform calendarului musulman, anul este 1398. Bun venit în lumea mare, prietene programator.

2. Crearea unui obiect calendar

Vom folosi calendarul gregorian, deoarece este cel mai comun din lume. Cel puțin până când China cumpără Oracle și face ca calendarul chinezesc să fie cel principal.

Puteți crea un obiect calendar cu orice dată folosind o declarație ca aceasta:

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

Da, trebuie să scrii GregorianCalendarde fiecare dată. În loc de Calendar, puteți scrie GregorianCalendar, de asemenea, asta va funcționa. Dar scrisul Calendareste mai scurt.

Anul trebuie scris în întregime, de exemplu, nu puteți scrie 19 în loc de 2019. Lunile sunt încă numerotate de la zero. Dar, ca și înainte, zilele lunii nu sunt numărate de la zero. Tocilari!

Pentru a seta ora și data, trebuie să introduceți ora ca argumente suplimentare:

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

Puteți chiar trece în milisecunde dacă este necesar. Sunt parametrul după numărul de secunde.

3. Afișarea unui obiect calendar pe ecran

Dacă pur și simplu imprimați un obiect calendar pe ecran, nu veți fi foarte mulțumit de rezultat.

Cod
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Ieșire de consolă
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=?]

Lucrul de reținut aici este că un calendar este un calendar, nu o dată : are tot felul de setări care vor fi toate afișate pe ecran.

Ar fi potrivit să folosiți un SimpleDateFormatobiect pentru a afișa un calendar, dar până când îl studiem, puteți folosi acest hack de viață.

Date date = calendar.getTime();

Un Calendarobiect poate fi ușor convertit într-un Dateobiect și știți deja cum să afișați un Dateobiect. Puteți utiliza cod ca acesta pentru a converti un Calendarobiect într-un Date:

Folosind getTime()metoda:

Cod Ieșire de consolă
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Este o chestiune cu totul diferită, nu-i așa?

4. Lucrul cu elemente ale unei date

Pentru a obține un element specific al unei date (ex. anul, luna, ...), clasa Calendarare get()metoda. Este o singură metodă, dar are parametri:

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

Unde calendareste o Calendarvariabilă și MONTHeste un câmp constant al Calendarclasei.

Treceți unul dintre Calendarcâmpurile constante ale clasei ca argument metodei getși obțineți valoarea dorită ca rezultat.

Exemple

Cod Descriere
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);


era (înainte sau după era comună)
an
luna
ziua lunii

ziua săptămânii
ore
minute
secunde

Pentru a schimba un element al unei date, utilizați setmetoda:

calendar.set(Calendar.MONTH, value);

Unde calendareste o Calendarvariabilă și MONTHeste un câmp constant al Calendarclasei.

Când lucrați cu setmetoda, treceți unul dintre Calendarcâmpurile constante ale clasei ca prim argument și noua valoare ca al doilea argument.

Exemple

Cod Descriere
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());


an = 2019
luna = iulie (numerotat de la 0)
a 4-a zi
ore
minute
secunde

5. Constantele Calendarclasei

Câmpurile constante ale Calendarclasei nu sunt limitate la cele pentru denumirea elementelor unei date. Se pare că există câmpuri pentru fiecare ocazie.

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

De exemplu, există câmpuri constante pentru a face referire la luni:

Și, de asemenea, zilele săptămânii:

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

Nu vom enumera totul. Doar nu vrem să fii surprins dacă vezi constante ca aceasta în cod.

Folosirea constantelor face codul mai lizibil, motiv pentru care programatorii le folosesc. Și lunile sunt numărate de la zero, de asemenea, pentru a îmbunătăți lizibilitatea. Sau nu.

6. Modificarea datei într-un Calendarobiect

Clasa Calendarare o metodă care vă permite să operați la o întâlnire în moduri mai inteligente. De exemplu, puteți adăuga un an, o lună sau câteva zile la o dată. Sau ia-le. Această metodă se numește add(). Lucrul cu el arată astfel:

calendar.add(Calendar.MONTH, value);

Unde calendareste o Calendarvariabilă și MONTHeste un câmp constant al Calendarclasei.

Când lucrați cu addmetoda, treceți unul dintre Calendarcâmpurile constante ale clasei ca prim argument și ca al doilea argument - noua valoare care trebuie adăugată.

Aceasta este o altă metodă inteligentă. Să vedem cât de inteligent este:

Cod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Ieșire de consolă
Fri Mar 01 00:00:00 EET 2019

Această metodă înțelege că în februarie 2019 sunt doar 28 de zile, deci data rezultată este 1 martie.

Acum hai să luăm 2 luni! Ce ar trebui să obținem? 27 decembrie 2018! Să verificăm acum.

Pentru a efectua o operație care are ca rezultat o dată anterioară, trebuie să transmiteți o valoare negativă metodei add():

Cod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Ieșire de consolă
Thu Dec 27 00:00:00 EET 2018

Funcționează!

Această metodă ia în considerare duratele diferite ale lunilor, precum și anii bisecți. Una peste alta, o metodă grozavă. Este exact ceea ce au nevoie majoritatea programatorilor care lucrează cu date.

7. Elementele rulante ale unei date

Dar uneori există situații în care nu dorim acest comportament inteligent, de exemplu, vrei să faci ceva pentru o parte a întâlnirii fără a schimba totul.

Clasa Calendarare metoda specială roll()pentru aceasta. Semnătura sa este la fel ca add()metoda, dar această metodă modifică doar un element al datei, lăsând restul neschimbat.

Exemplu:

Cod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Ieșire de consolă
Fri Dec 27 00:00:00 EET 2019

Am schimbat luna, dar anul și data au rămas neschimbate.