1. Tarix və vaxt üzərində toplama və çıxma
Proqramlaşdırmada tarix və vaxtla iş — təkcə “tarixi ekrana gözəl çıxarmaq” deyil. Çox vaxt tələb olunur:
- mühüm hadisəyə neçə gün qaldığını bilmək;
- istifadəçinin yaşını hesablamaq;
- iki hadisə arasında nə qədər vaxt keçdiyini müəyyən etmək;
- deadline-ın gəlib-gəlmədiyini yoxlamaq;
- tarixə müəyyən sayda gün, həftə, ay və ya saat əlavə etmək.
Məsələn, tətbiqimizdə istifadəçiyə tapşırığın deadline-ına 3 gün qaldığını xatırlatmaq istəyirik. Yaxud (əgər tarix artıq keçibsə) onun ad günü münasibətilə gecikmiş təbrik göndərmək.
Bunun üçün java.time-da belə hesablamaları sadə və təhlükəsiz edən xüsusi siniflər və metodlar var.
Toplama və çıxma üçün əsas metodlar
Bütün tarix və vaxt siniflərində (LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant) bu metodlar var:
- plusXxx() — əlavə etmək (günlər, aylar, illər, saatlar, dəqiqələr və s.)
- minusXxx() — çıxmaq (eyni şey)
import java.time.LocalDate;
LocalDate today = LocalDate.now(); // Bugünkü tarix
LocalDate tomorrow = today.plusDays(1); // Sabah
LocalDate nextMonth = today.plusMonths(1); // Bir ay sonra
LocalDate lastWeek = today.minusWeeks(1); // Bir həftə əvvəl
System.out.println("Bu gün: " + today);
System.out.println("Sabah: " + tomorrow);
System.out.println("Bir ay sonra: " + nextMonth);
System.out.println("Bir həftə əvvəl: " + lastWeek);
Bu metodların hamısı yeni obyekt qaytarır, ilkin obyekti dəyişmir. Dəyişməzlik — hər şeydir!
import java.time.LocalTime;
LocalTime now = LocalTime.now();
LocalTime inTwoHours = now.plusHours(2);
LocalTime tenMinutesAgo = now.minusMinutes(10);
System.out.println("İndi: " + now);
System.out.println("2 saat sonra: " + inTwoHours);
System.out.println("10 dəqiqə əvvəl: " + tenMinutesAgo);
Kombinə edilmiş metodlar
LocalDate vacation = today.plusMonths(2).plusDays(10);
System.out.println("Məzuniyyət: " + vacation);
2. Tarixlər arasındakı fərqin alınması: Period və Duration
İki tarix və ya zaman anı arasında nə qədər vaxt keçdiyini bilmək lazım olanda səhnəyə iki qəhrəman çıxır — Period və Duration. Gəlin onlarla yaxından tanış olaq.
Period və Duration arasında fərq nədədir?
- Period — tarixlərlə iş üçün (il, ay, gün). Məsələn, “3 il, 2 ay və 5 gün”.
- Duration — vaxtla iş üçün (saat, dəqiqə, saniyə, nanosaniyə). Məsələn, “5 saat 30 dəqiqə”.
| Sinif | Nə üçün nəzərdə tutulub | İstifadə nümunəsi |
|---|---|---|
|
Tarixlər arasındakı fərq | Tarixlər arasında neçə il/ay/gün var |
|
Anlar arasındakı fərq | Hadisələr arasında neçə saat/dəqiqə/saniyə var |
Nümunə: istifadəçinin yaşını hesablamaq
import java.time.LocalDate;
import java.time.Period;
LocalDate birthday = LocalDate.of(2000, 1, 15); // Ad günü
LocalDate today = LocalDate.now();
Period age = Period.between(birthday, today);
System.out.println("Yaş: " + age.getYears() + " il, " +
age.getMonths() + " ay, " +
age.getDays() + " gün");
Bənzətmə: Period — tarixlər arasındakı “insan” fərqi kimidir (“mən 24 il 5 ay 12 günlükəm”).
Nümunə: deadline-a nə qədər vaxt qalıb
import java.time.LocalDate;
LocalDate deadline = LocalDate.of(2025, 7, 1);
LocalDate today = LocalDate.now();
if (today.isBefore(deadline)) {
Period left = Period.between(today, deadline);
System.out.println("Deadline-a qalan vaxt: " +
left.getMonths() + " ay və " +
left.getDays() + " gün");
} else {
System.out.println("Deadline artıq keçib!");
}
Duration: vaxt fərqi
import java.time.LocalDateTime;
import java.time.Duration;
LocalDateTime start = LocalDateTime.of(2025, 6, 1, 10, 0, 0);
LocalDateTime end = LocalDateTime.of(2025, 6, 1, 15, 30, 0);
Duration duration = Duration.between(start, end);
System.out.println("Müddət: " + duration.toHours() + " saat " +
(duration.toMinutes() % 60) + " dəqiqə");
Duration fərqi saniyə, dəqiqə, saat, günlərlə ölçür (amma günlər həmişə 24 saat sayılır, təqvim özəllikləri nəzərə alınmır).
Müqayisə: nə vaxt Period, nə vaxt Duration istifadə etməli?
- Yalnız tarixləriniz varsa — Period istifadə edin.
- Vaxt komponentiniz varsa (məsələn, LocalDateTime, Instant) — Duration istifadə edin.
3. Tarix və vaxtın müqayisəsi: isBefore, isAfter, equals
Bəzən sadəcə anlamaq lazımdır: tarix artıq gəlib, yoxsa hələ yox? Hadisə keçmişdədir, yoxsa gələcəkdə? Bunun üçün bütün tarix və vaxt siniflərində bu metodlar var:
- isBefore(drugayaData)
- isAfter(drugayaData)
- isEqual(drugayaData) (ya da sadəcə equals)
import java.time.LocalDate;
LocalDate today = LocalDate.now();
LocalDate deadline = LocalDate.of(2025, 7, 1);
if (today.isBefore(deadline)) {
System.out.println("Hələ də vaxt var!");
} else if (today.isEqual(deadline)) {
System.out.println("Bu gün deadline!");
} else {
System.out.println("Deadline artıq keçib :(");
}
import java.time.LocalTime;
LocalTime now = LocalTime.now();
LocalTime lunch = LocalTime.of(13, 0);
if (now.isAfter(lunch)) {
System.out.println("Nahar artıq olub!");
} else {
System.out.println("Nahara hələ vaxt var.");
}
Vacibdir: yalnız eyni tipli obyektləri müqayisə etmək olar (LocalDate ilə LocalDate, LocalDateTime ilə LocalDateTime və s.).
4. Təcrübə: fərqin hesablanması və müddətlərin yoxlanması üzrə tapşırıqlar
Nümunə: tapşırığın deadline-ına neçə gün qalıb
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
LocalDate today = LocalDate.now();
LocalDate deadline = LocalDate.of(2025, 7, 1);
long daysLeft = ChronoUnit.DAYS.between(today, deadline);
if (daysLeft > 0) {
System.out.println("Deadline-a " + daysLeft + " gün qalıb");
} else if (daysLeft == 0) {
System.out.println("Bu gün deadline!");
} else {
System.out.println("Deadline " + Math.abs(daysLeft) + " gün əvvəl keçib");
}
ChronoUnit.DAYS.between() — iki tarix arasında dəqiq gün sayını öyrənməyin rahat yoludur (aylar və illər nəzərə alınmadan).
Nümunə: iki hadisə arasında neçə saniyə var
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
LocalDateTime start = LocalDateTime.of(2025, 6, 1, 10, 0, 0);
LocalDateTime end = LocalDateTime.of(2025, 6, 1, 15, 30, 0);
long seconds = ChronoUnit.SECONDS.between(start, end);
System.out.println("Hadisələr arasında " + seconds + " saniyə keçib");
Nümunə: tapşırığın yaşının hesablanması
import java.time.LocalDate;
import java.time.Period;
LocalDate created = LocalDate.of(2025, 5, 20);
LocalDate today = LocalDate.now();
Period period = Period.between(created, today);
System.out.println("Tapşırıq " +
period.getDays() + " gün, " +
period.getMonths() + " ay və " +
period.getYears() + " il əvvəl yaradılıb.");
Nümunə: iki Instant arasındakı müddət
import java.time.Instant;
import java.time.Duration;
Instant start = Instant.now();
// ... nəsə edirik ...
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println("İcra " + duration.toMillis() + " millisaniyə çəkdi");
5. Period və Duration istifadə xüsusiyyətləri
Period-un xüsusiyyətləri
- Period fərqi təqvim üzrə sayır: 28 fevral ilə 1 mart arasında — 1 gün, hətta bunlar müxtəlif aylar olsa belə.
- İllərin, ayların, günlərin sayını ayrıca almaq olar: getYears(), getMonths(), getDays().
- Tarixlər arasında ümumi gün sayını bilmək lazım olsa — ChronoUnit.DAYS.between() istifadə edin.
Duration-un xüsusiyyətləri
- Duration dəqiq vaxtla (saat, dəqiqə, saniyə) işləyir.
- LocalTime, LocalDateTime, Instant ilə işləyə bilər.
- Vaxtsız tarixlər (LocalDate) üçün istifadə etmək olmaz — istisna atılacaq.
Nümunə: Period və Duration arasındakı fərq
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Duration;
import java.time.Period;
LocalDate date1 = LocalDate.of(2025, 2, 28);
LocalDate date2 = LocalDate.of(2025, 3, 1);
Period period = Period.between(date1, date2); // 2 gün (sıçrayış ili)
long days = java.time.temporal.ChronoUnit.DAYS.between(date1, date2); // 2 gün
System.out.println("Period: " + period.getDays() + " gün");
System.out.println("ChronoUnit: " + days + " gün");
LocalDateTime dt1 = LocalDateTime.of(2025, 6, 1, 23, 0);
LocalDateTime dt2 = LocalDateTime.of(2025, 6, 2, 1, 0);
Duration duration = Duration.between(dt1, dt2); // 2 saat
System.out.println("Duration: " + duration.toHours() + " saat");
6. Fərqi istifadəçiyə rahat formada göstərmək üçün Duration və Period-dan istifadə
Tarix və ya vaxt fərqini istifadəçiyə göstərərkən “123456 saniyə” kimi göstərmək həmişə əlverişli deyil. Adətən “2 gün 3 saat 15 dəqiqə” kimi nəsə istənilir.
Nümunə: tarix və vaxt arasındakı fərqin çıxışı
import java.time.LocalDateTime;
import java.time.Duration;
LocalDateTime start = LocalDateTime.of(2025, 6, 1, 14, 0);
LocalDateTime end = LocalDateTime.of(2025, 6, 3, 16, 30);
Duration duration = Duration.between(start, end);
long days = duration.toDays();
long hours = duration.minusDays(days).toHours();
long minutes = duration.minusDays(days).minusHours(hours).toMinutes();
System.out.println("Fərq: " + days + " gün " +
hours + " saat " + minutes + " dəqiqə");
7. ZonedDateTime və Instant ilə işləyərkən xüsusiyyətlər
- Müxtəlif zonalarda olan iki ZonedDateTime arasındakı fərq nisbi “insani” vaxta görə deyil, mütləq vaxta görə hesablanır.
- Yay/qış vaxtına keçid tarixlər arasındakı saat fərqinə təsir göstərə bilər.
Nümunə: iki ZonedDateTime arasındakı fərq
import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.Duration;
ZonedDateTime MinskTime = ZonedDateTime.of(2025, 6, 1, 12, 0, 0, 0, ZoneId.of("Europe/Minsk"));
ZonedDateTime nyTime = ZonedDateTime.of(2025, 6, 1, 5, 0, 0, 0, ZoneId.of("America/New_York"));
Duration diff = Duration.between(nyTime, MinskTime);
System.out.println("Fərq: " + diff.toHours() + " saat");
8. Tarix və vaxtla hesablamalarda tipik səhvlər
Səhv №1: Period və Duration qarışdırılır.
Duration-u LocalDate üçün istifadə etməyə çalışsanız, istisna alacaqsınız. Tarixlər üçün Period, vaxt üçün isə Duration istifadə edin.
Səhv №2: Saat qurşaqları nəzərə alınmır.
Müxtəlif saat qurşaqlarında tarix və vaxtı müqayisə etsəniz, gözlənilməz nəticələr ala bilərsiniz. Hər şeyi eyni qurşağa gətirmək və ya Instant istifadə etmək daha yaxşıdır.
Səhv №3: plus/minus metodlarının obyekti dəyişdiyini güman edirlər.
java.time obyektlərinin hamısı dəyişməzdir! Nəticəni yeni dəyişənə təyin etməyi unutmayın (məsələn, today = today.plusDays(1)).
Səhv №4: Period üçün getDays() istifadə olunur və bunun ümumi gün sayı olduğu düşünülür.
Əslində bu, illər və aylar çıxıldıqdan sonra qalan günlərdir. Ümumi gün sayını əldə etmək üçün ChronoUnit.DAYS.between() istifadə edin.
Səhv №5: Müxtəlif tipli obyektlər müqayisə olunur.
isBefore, isAfter, isEqual metodları yalnız eyni tipdən olan obyektlər üçün işləyir (məsələn, LocalDate ilə LocalDate).
GO TO FULL VERSION