1. Date Time API-yə giriş
Java yaradıcılarına Date
və Calendar
sinifləri ilə mövcud vəziyyət çox da xoş gəlmirdi. O vaxt üçün yaxşı idilər, amma zaman dəyişir. Və sadə, güclü və etibarlı bir şey lazım idi. Beləliklə, Java8 çıxışı ilə birlikdə (Calendar
-dan çıxışdan 15 il sonra) Java Date Time API: zaman ilə olan bütün mümkün problemləri həll etməli olan siniflər toplusu təqdim olundu.
Siniflər o qədər çox idi ki, onları bir neçə paket üzrə bölməyə qərar verdilər:
java.time
paketi — Java Date Time API üçün əsas paket: burada LocalDate
, LocalTime
, LocalDateTime
, Instant
, Period
, Duration
kimi siniflər yerləşir. Bu siniflərin bütün obyektləri — immutable
-dir: yaradıldıqdan sonra onları dəyişmək mümkün deyil.
java.time.format
paketi zamanın formatlaşdırılması üçün siniflərdən ibarətdir: zaman (və tarix) mətn sətrinə və geriyə çevrilməsi. Məsələn, burada SimpleDateFormat
-un yerinə gəlmiş universal DateTimeFormatter
sinfi yerləşir.
java.time.zone
paketi zaman zonaları (time zones) ilə iş üçün siniflərdən ibarətdir. Burada TimeZone
və ZonedDateTime
kimi siniflər mövcuddur. Əgər siz müxtəlif yerlərdə yerləşən müştəriləri olan server üçün kod yazırsınızsa, bu siniflər sizə çox lazım olacaq.
2. LocalDate
sinfi
İlk və ən faydalı sinif Date Time API-dən öyrənəcəyimiz sinif LocalDate
olacaq. Yəqin ki, adından da anladığınız kimi, bu sinif tarixlə işləmək üçün yaradılıb.
Bu sinfin obyektləri yaradıldıqdan sonra dəyişdirilmir (LocalDate
immutable-dır). Amma bu sinfi sadələşdirib, etibarlı edib. Xüsusilə də sinifin obyekti ilə bir vaxtda bir neçə iplik (execution thread) işləyirsə.
Yeni LocalDate
obyekti yaratmaq üçün bir neçə static metoddan birini istifadə etmək lazımdır. Əsaslarını göstəririk.
Cari tarixin alınması
Cari tarixi almaq üçün now()
adlı static metodu istifadə etmək lazımdır. Bu düşündüyünüzdən də asandır:
LocalDate today = LocalDate.now();
Burda today
— LocalDate
-sinifinin dəyişəni, LocalDate.now()
isə LocalDate
sinfinin static metod olan now()
çağırışıdır.
Nümunə:
Kod | Ekranda nəticə |
---|---|
|
|
Müəyyən saat qurşağındakı tarixi almaq
Həmçinin LocalDate
sinifində now(ZoneId)
metodu var ki, bu da müəyyən saat qurşağındakı tarixi almağa imkan verir.
Bunun üçün bizə başqa bir sinif — ZoneId
(java.time.ZoneId) lazım olacaq. Bu sinifdə of()
metodu var. Bu metod isə verilən saat qurşağı adından ZoneId
obyektini qaytarır.
Məsələn, Şanxaydakı cari tarixi təyin etmək üçün belə bir kod yazmaq lazımdır:
Kod | Ekranda nəticə |
---|---|
|
|
Bütün saat qurşaqlarının (time zone) adlarını internetdə tapa bilərsiniz.
3. Müəyyən tarixin əldə edilməsi
Müəyyən bir tarixi saxlayan LocalDate
obyektini əldə etmək üçün of()
statik metodundan istifadə etmək lazımdır. Çox sadə və başadüşüləndir:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Burada date
— LocalDate
sinfinin dəyişənidir, LocalDate.of()
isə of()
statik metodunun çağırılmasıdır.
Bundan əlavə, burada Fevral ayını təyin etmək üçün Month
(java.time.Month) sinfinin xüsusi FEBRUARY
konstantından istifadə edirik.
Ayı köhnə üsulla, yəni rəqəmlə də təyin etmək olar:
LocalDate date = LocalDate.of(2019, 2, 22);
İki? Fevralın əvəzinə? Deməli, aylara yenə birən başlayaraq nömrə verilir?
Bəli, nəhayət ki, Java yaradıldıqdan sonra 20 ildən çox keçəndən sonra aylara sıfırdan başlayaraq nömrə verilməsi dayandırılıb.
Misal:
Kod | Ekrana çıxış |
---|---|
|
|
Günün nömrəsinə görə tarixin əldə edilməsi
Tarix yaratmaq üçün digər maraqlı bir metod var: ofYearDay
metodu ilin nömrəsini və ilin gün nömrəsini bildikdə tarixi əldə etməyə imkan verir. Ümumi görünüşü belədir:
LocalDate date = LocalDate.ofYearDay(il, gün);
Burada il — ilin nömrəsi, gün isə ilin gün nömrəsidir.
Misal:
Kod | Ekrana çıxış |
---|---|
|
|
2019-cu ilin 100-cü günü — bu 10 aprel tarixidir.
Unix tarixinin əldə edilməsi
Yadınızdadırmı, Date
sinfinin obyektləri həmişə 1 yanvar 1970-ci ildən bəri olan zamanın millisekundlarla saxlanmasını təmin edirdi? Daha eski yaxşı zamanları xatırlamaq üçün LocalDate
sinfinə ofEpochDay()
metodunu əlavə ediblər ki, bu da 1 yanvar 1970-ci ildən hesablansa tarix qaytarır. Ümumi görünüşü belədir:
LocalDate date = LocalDate.ofEpochDay(gün);
Burada gün
— bu, 1 yanvar 1970-ci ildən bəri keçən günlərin sayıdır.
Misal:
Kod | Ekrana çıxış |
---|---|
|
|
4. Tarix fraqmentlərinin əldə edilməsi
LocalDate
sinfinin obyektlərini dəyişmək olmaz, amma tarixdən ayrı-ayrı fraqmentləri əldə etmək olar. Bunun üçün LocalDate
sinfinin obyektlərində bir neçə metod var:
Metod | Təsvir |
---|---|
|
Verilən tarixdən ili qaytarır |
|
Tarixin ayını qaytarır — xüsusi sabitlərdən biriJANUARY, FEBRUARY, ...; |
|
Tarixin ay nömrəsini qaytarır. Yanvar == 1. |
|
Ay daxilində gün nömrəsini qaytarır |
|
Tarixdən ilin əvvəlindən olan gün nömrəsini qaytarır |
|
Həftənin gününü qaytarır: xüsusi bir sabitlərdən biriMONDAY, TUESDAY, ...; |
|
Eranı qaytarır: sabitlərdən biri olaraq BC (Aktual Eradan əvvəl) və CE (Aktual Era) |
Nümunə:
Kod | Ekrana çıxış |
---|---|
|
|
5. LocalDate
obyektində tarixi dəyişmək
LocalDate
sinfi tarixi redaktə etməyə imkan verən bir neçə metodu ehtiva edir. Bu metodlar String
sinfinin metodlarına bənzər şəkildə işləyir: bu metodlardan hər biri mövcud LocalDate
obyektini dəyişmir, əvəzində istənilən məlumatlarla yeni bir obyekt qaytarır.
LocalDate
sinfinin bu metodları var:
Metod | Təsvir |
---|---|
|
Tarixə müəyyən sayda gün əlavə edir |
|
Tarixə həftələr əlavə edir |
|
Tarixə aylar əlavə edir |
|
Tarixə illər əlavə edir |
|
Tarixdən müəyyən sayda gün çıxır |
|
Tarixdən həftələr çıxır |
|
Tarixdən aylar çıxır |
|
Tarixdən illər çıxır |
Nümunə:
Kod | Ekrana çıxış |
---|---|
|
|
Bizim metodlarını çağırdığımız birthday
obyekti dəyişmir. Bunun əvəzinə, metodlar tələb olunan məlumatları ehtiva edən yeni obyektlər qaytarır.
GO TO FULL VERSION