CodeGym /Kurslar /Java SELF AZ /Calendar Klassa

Calendar Klassa

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Date sinfindən Calendar sinfinə keçid

<code>Date</code> sinfindən <code>Calendar</code> sinfinə keçid

Proqramçılar Date sinfini sadəliyi və Unix standartlarını dəstəkləməsi üçün sevirdilər, amma bildiyimiz kimi, üstünlüklərimiz çatışmazlıqlarımızın davamıdır.

Proqramçılar «ağıllı Date sinfi» istəyirdilər. Və belə bir sinif yarandı: bu sinif Calendar oldu. O, sadəcə tarixləri saxlamaq üçün yox, həm də tarixlərlə çətin işləri yerinə yetirmək üçün bir alət kimi düşünüldü.

Calendar sinfinin tam adı — java.util.Calendar'dır. Əgər kodunuzda istifadə etməyi qərara alsanız, onu import etməyi unutmayın.

Calendar obyektini yaratmaq üçün aşağıdakı komandanı istifadə edə bilərsiniz:

Calendar date = Calendar.getInstance();

getInstance() adlı statik metod Calendar sinfində Calendar obyektini yaradacaq, bu obyekt cari tarixlə işə salınacaq. Proqramın işlədiyi kompyuterin qurğularından asılı olaraq, uyğun olan təqvim yaradılacaq.

Daha düzgün desək — aktual olan. Məsələ ondadır ki, Yer üzündə tək bir yox, bir çox təqvim var. Və onların demək olar ki, hər biri hansısa din və ya ölkə ilə bağlıdır. Calendar sinfi onlardan üçünü dəstəkləyir:

Təqvim Təsvir
GregorianCalendar Xristian Qriqorian təqvimi
BuddhistCalendar Budda təqvimi
JapaneseImperialCalendar Yapon İmperator təqvimi

Hələ Çin və Ərəb təqvimləri də var. Ümumiyyətlə, vaxtla işləmək düşündüyümüz qədər sadə deyil.

Çində bu dərsin yazıldığı anda rəsmi olaraq 4716-cı ildir. Müsəlman təqviminə görə isə — 1398-ci il. Geniş dünyaya xoş gəldin, proqramçı dostum.

2. Calendar obyektinin yaradılması

Biz dünyada ən çox istifadə olunan Qriqorian Təqvimindən istifadə edəcəyik. Ən azından Çin Oracle şirkətini alıb öz təqvimini əsas etməyənə qədər.

Təsadüfi bir tarixə malik Calendar obyekti aşağıdakı komandadan istifadə edərək yaradılır:

Calendar date = new GregorianCalendar(il, ay, gün);

Bəli, hər dəfə GregorianCalendar yazmaq lazım olacaq. Calendar əvəzinə GregorianCalendar yazmaq da mümkündür: bu da işləyəcək. Amma sadəcə Calendar yazmaq daha qısadır.

İli tam yazmaq lazımdır: 2019 yerinə 19 yazmaq olmaz. Aylar yenə də sıfırdan başlayaraq nömrələnir. Amma ayın günləri sıfırdan başlamır (zəiflər!).

Təkcə tarixi yox, həm də vaxtı göstərmək üçün əlavə parametrlər ötürmək lazımdır:

... = new GregorianCalendar(il, ay, gün, saat, dəqiqə, saniyə);

Hətta ehtiyac varsa millisekundları belə ötürə bilərsiniz: onlar saniyələrdən sonra növbəti parametr kimi göstərilir.

3. Calendar obyektini ekrana çıxarmaq

Sadəcə Calendar obyektini ekrana çıxarsanız, nəticə sizi çox da sevindirməyəcək.

Kod
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Ekranda çıxışı
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=?]

Məsələ burasındadır ki, calendar — əslində təqvimdir, tarix deyil: onda bir çox tənzimləmələr var və onların hamısı ekrana çıxarılır.

Calendar obyektini düzgün göstərmək üçün SimpleDateFormat sinfini istifadə etmək lazımdır, amma biz onu hələ ki öyrənməmişik, buna görə də bir hiylə istifadə edə bilərik.

Date date = calendar.getTime();

Məsələ burasındadır ki, Calendar tipli obyekt asanlıqla Date tipli obyektə çevrilə bilər, və Date tipli obyektin ekrana necə çıxarılacağını artıq bilirsiniz. Təqribən belə bir şəkildə Calendar obyektini Date obyektinə çevirə bilərsiniz:

getTime() metodunun istifadəsi:

Kod Ekranda çıxışı
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Tam başqa bir şey, elə deyil?

4. Tarix fraqmentləri ilə işləmək

Tarix fraqmentlərini (il, ay, ...) əldə etmək üçün Calendar sinfində xüsusi bir metod var — get(). Metod birdir, amma parametrlərlə işləyir:

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

Burada calendar — Calendar tipli dəyişən, və MONTH — Calendar sinfindən konstanta dəyişəndir.

get metoduna parametr olaraq Calendar sinfinin xüsusi konstanasını ötürürsünüz və nəticədə tələb olunan dəyəri alırsınız.

Nümunələr

Kod Təsvir
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 (eradan əvvəl və ya sonra)
il
ay
ayın günü

həftə günü
saatlar
dəqiqələr
saniyələr

Tarix fraqmentini dəyişmək üçün set metodu istifadə olunur:

calendar.set(Calendar.MONTH, dəyər);

Burada calendar — Calendar tipli dəyişən, və MONTH — Calendar sinfindən konstanta dəyişəndir.

set metoduna birinci parametr olaraq Calendar sinfinin xüsusi konstanasını, ikinci parametr olaraq yeni dəyər ötürürsünüz.

Nümunələr

Kod Təsvir
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());


il = 2019
ay = İyul (sıfırdan başlayır)
4-cü gün
saatlar
dəqiqələr
saniyələr

5. Calendar sinfinin konstantları

Calendar sinfində təkcə tarix fraqmentlərinin adları üçün deyil, elə bil ki, hər hal üçün konstantlar mövcuddur.

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

Məsələn, ayları göstərmək üçün konstantlar var:

Və ya məsələn, həftənin günləri üçün:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("Bu cümədir");
}

Hamısını sadalamayacağıq. Sadəcə istəyirik ki, kodda belə yazılarla rastlaşanda təəccüblənməyəsiniz.

Konstantlardan istifadə kodu daha oxunaqlı edir, buna görə proqramçılar onları əlavə edirlər. Aylar isə sıfırdan nömrələnib ki, oxunaqlıq artsın. Və ya yox.

6. Calendar obyektində tarixin dəyişdirilməsi

Calendar sinfinin tarix üzərində daha ağıllı əməliyyatlar aparmağa imkan verən metodu var. Məsələn, tarixə il, ay və ya bir neçə gün əlavə edə bilərsiniz. Və ya çıxmaq olar. Bu metod add() adlanır. Onunla iş belə görünə bilər:

calendar.add(Calendar.MONTH, dəyər);

Burada calendar — Calendar tipində dəyişəndir, MONTH — Calendar sinfinin sabit dəyişənidir.

add metoduna birinci parametr kimi Calendar sinfinin xüsusi sabiti, ikinci parametr kimi isə əlavə olunacaq dəyər ötürülür.

Bu metodun xüsusiyyəti ondadır ki, o, ağıllıdır. Gəlin özümüz yoxlayaq, nə qədər?

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Ekrana Çıxış
Fri Mar 01 00:00:00 EET 2019

Bu metod anlayır ki, 2019-cu ilin fevralında cəmi 28 gün var və nəticə tarixi 1 martdır.

İndi isə gəlin 2 ay çıxaq! Nə alınmalıdır? 27 dekabr 2018-ci il! İndi yoxlayaq.

Tarixi azaltmaq üçün əməliyyatı həyata keçirmək üçün add() metoduna mənfi işarəsi ilə dəyər ötürmək lazımdır:

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Ekrana Çıxış
Thu Dec 27 00:00:00 EET 2018

İşləyir!

Bu metod ayların uzunluğunu və artıq ili nəzərə alır. Ümumiyyətlə, əla metoddur. Tarixlərlə sıx işləyən əksər proqramçılar üçün lazım olan şeydir.

7. Tarixin hissələrinin dəyişdirilməsi

Amma bəzən elə hallar olur ki, bu ağıllı davranış artıq olur: tarixin bir hissəsilə nəsə etmək istəyirsən, qalanlarını dəyişdirmədən.

Bunun üçün Calendar sinfində xüsusi bir metod var — roll(). Onun imzası add() metodunun tam analoqudur, amma onunla edilən hər hansı dəyişiklik yalnız bir parametri təsir edir, digərləri isə dəyişməz qalır.

Nümunə:

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Ekranda çıxış
Fri Dec 27 00:00:00 EET 2019

Ay dəyişdirildi, amma il və gün dəyişməz qaldı.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION