CodeGym /Kurslar /JAVA 25 SELF /Tarixlər üzərində hesablamalar və müqayisə, Duration, Per...

Tarixlər üzərində hesablamalar və müqayisə, Duration, Period

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

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 — PeriodDuration. 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
Period
Tarixlər arasındakı fərq Tarixlər arasında neçə il/ay/gün var
Duration
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).

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Bayrama geri sayım 🎉
Bayrama geri sayım 🎉
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Zaman maşını: tarixin gəlib çatdığını yoxlamaq 🕰️
Zaman maşını: tarixin gəlib çatdığını yoxlamaq 🕰️
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Layihə idarəçiliyi: son tarixə neçə gün qaldı? 🗓️
Layihə idarəçiliyi: son tarixə neçə gün qaldı? 🗓️
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Əmlak agentliyi: binanın yaşının hesablanması 🏡
Əmlak agentliyi: binanın yaşının hesablanması 🏡
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Tarixlər və vaxt
Tarixlər, vaxt və timezone-lar
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION