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