1. Date
sinfindən Calendar
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 |
---|
|
Ekranda çıxışı |
|
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ışı |
---|---|
|
|
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 |
---|---|
|
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 |
---|---|
|
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 |
---|
|
Ekrana Çıxış |
|
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 |
---|
|
Ekrana Çıxış |
|
İş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 |
---|
|
Ekranda çıxış |
|
Ay dəyişdirildi, amma il və gün dəyişməz qaldı.
GO TO FULL VERSION