CodeGym /Kurslar /Java SELF AZ /Müasir tarixlə işləmə

Müasir tarixlə işləmə

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

1. Date Time API-yə giriş

Date Time API-yə giriş

Java yaradıcılarına DateCalendar 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 TimeZoneZonedDateTime 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 todayLocalDate-sinifinin dəyişəni, LocalDate.now() isə LocalDate sinfinin static metod olan now() çağırışıdır.

Nümunə:

Kod Ekranda nəticə
LocalDate today = LocalDate.now();
System.out.println("Bugün = " + today);

Bugün = 2019-02-22

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ə
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("İndi Şanxayda = " + today);


İndi Şanxayda = 2019-02-22

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 dateLocalDate 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ış
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Bugün = " + today);

Bugün = 2019-02-22

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ış
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Bugün = " + today);

Bugün = 2019-04-10

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ış
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Bugün = " + today);

Bugün = 1970-01-02

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
int getYear()
Verilən tarixdən ili qaytarır
Month getMonth()
Tarixin ayını qaytarır — xüsusi sabitlərdən biri
JANUARY, FEBRUARY, ...;
int getMonthValue()
Tarixin ay nömrəsini qaytarır. Yanvar == 1.
int getDayOfMonth()
Ay daxilində gün nömrəsini qaytarır
int getDayOfYear()
Tarixdən ilin əvvəlindən olan gün nömrəsini qaytarır
DayOfWeek getDayOfWeek()
Həftənin gününü qaytarır: xüsusi bir sabitlərdən biri
MONDAY, TUESDAY, ...;
IsoEra getEra()
Eranı qaytarır: sabitlərdən biri olaraq BC (Aktual Eradan əvvəl) və CE(Aktual Era)

Nümunə:

Kod Ekrana çıxış
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

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
plusDays(int days)
Tarixə müəyyən sayda gün əlavə edir
plusWeeks(int weeks)
Tarixə həftələr əlavə edir
plusMonths(int months)
Tarixə aylar əlavə edir
plusYears(int years)
Tarixə illər əlavə edir
minusDays(int days)
Tarixdən müəyyən sayda gün çıxır
minusWeeks(int weeks)
Tarixdən həftələr çıxır
minusMonths(int months)
Tarixdən aylar çıxır
minusYears(int years)
Tarixdən illər çıxır

Nümunə:

Kod Ekrana çıxış
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

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.


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