Duration — java.time paketindən olan, iki zaman anı arasındakı müddəti saniyə və nanosaniyələrdə təmsil edən dəyişməz sinif. Duration zaman əsaslı vaxt miqdarını — saatlar, dəqiqələr, saniyələr, millisaniyələr və nanosaniyələri ölçür. Oracle Java 17 (2024) spesifikasiyasına görə, Period-dan (il-ay-gün ölçən) fərqli olaraq, Duration dəqiq zaman vahidləri ilə işləyir və təqvimdən asılı deyil.
Əsas məqamlar
Duration — saniyə və nanosaniyələrdə vaxt miqdarını modelləşdirən sinif. O, təqvimə bağlı olmayan, fiziki saniyə sayını təmsil edən zaman əsaslı müddəti ifadə edir. Duration “125 dəqiqə” və ya “2 saat 5 dəqiqə” kimi təqdim edilə bilər — Period-dan fərqli olaraq, “2 ay” deyəcək.
Duration-un daxili quruluşu iki sahədən ibarətdir: long seconds (saniyələr) və int nanos (nanosaniyələr, 0-dan 999999999-a qədər). Qiymət mənfi ola bilər — bu zamanda “geriyə” doğru müddət deməkdir. Maksimum qiymət ±31557014167219200 saniyədir.
Baeldung (2024)-yə görə, Duration əməliyyat müddətini hesablamaq, vaxt aşımlarını təyin etmək və performansı ölçmək üçün əsas sinifdir. Duration dəyişməz və thread-safe-dir, bu da onu çox线程li mühitdə sinxronizasiya olmadan istifadə etməyə imkan verir.
Sinif Comparable, TemporalAmount və TemporalUnit interfeyslərini tətbiq edir. TemporalAmount LocalTime, LocalDateTime, Instant və ZonedDateTime siniflərinin plus/minus metodlarında Duration-dan istifadə etməyə imkan verir.
Əsas fərq — Duration dəqiq saniyə sayını (time-based), Period isə təqvim vahidlərini (date-based): il, ay, gün ölçür. Duration deyir: “86400 saniyə keçdi”. Period deyir: “1 gün keçdi”. Fərq yay vaxtına keçid zamanı özünü göstərir — Period-da 1 gün həmişə təqvimdə 1 günə bərabərdir, Duration-da 86400 saniyə isə DST-də 23 və ya 25 saata uyğun gələ bilər.
Duration fiziki vaxtı ölçmək üçün istifadə olunur: bağlantı vaxt aşımları, sorğunun icra müddəti, iki Instant arasındakı interval. Period təqvim hesablamaları üçün istifadə olunur: insanın yaşı (Period.between(doğumTarixi, buGün)), müqavilənin qüvvədə olma müddəti.
Duration saniyə və nanosaniyələrlə işləyir, buna görə onu hissələrə (saat, dəqiqə) bölmək olar. Period illər, aylar və günlərlə işləyir — bölünməz təqvim vahidləri. Oracle Java Tutorial (2024)-ə görə, Duration və Period arasında seçim tapşırıq növündən asılıdır: dəqiq vaxt vs təqvim tarixləri.
Ən geniş yayılmış üsul — Duration.between(Temporal start, Temporal end). Temporal Instant, LocalTime, LocalDateTime, ZonedDateTime — Temporal-ı tətbiq edən istənilən tip ola bilər. Metod start - end fərqini təmsil edən Duration qaytarır (mənfi ola bilər).
Statik fabrik metodları: Duration.ofSeconds(long), ofMinutes(long), ofHours(long), ofDays(long), ofMillis(long), ofNanos(long). Həmçinin ixtiyari vahidlər üçün of(long amount, TemporalUnit unit) var — ChronoUnit.HOURS, ChronoUnit.MINUTES və s.
parse(CharSequence) metodu ISO-8601 formatında sətir qəbul edir: “PT1H30M” (1 saat 30 dəqiqə), “PT45S” (45 saniyə), “P2DT3H” (2 gün 3 saat). Sətir həmişə “PT” (Period of Time) ilə başlayır.
val betweenMoments = Duration.between(
Instant.parse("2026-07-21T10:00:00Z"),
Instant.parse("2026-07-21T14:30:00Z")
)
val fromMinutes = Duration.ofMinutes(90)
val fromHours = Duration.ofHours(2)
val parsed = Duration.parse("PT1H30M")
Duration tam arifmetik əməliyyatlar dəstini dəstəkləyir. plus(Duration) və minus(Duration) metodları başqa bir müddəti əlavə edir və ya çıxarır. plusDays(), plusHours(), plusMinutes(), plusSeconds(), plusMillis(), plusNanos() metodları — vahidlərin dəqiq əlavə edilməsi üçün.
Vurma və bölmə üçün multipliedBy(long) və dividedBy(long) istifadə olunur. Duration.multipliedBy(2) müddəti iki qat artırır. Duration.dividedBy(3) üç hissəyə bölür, aşağı yuvarlaqlaşdırma ilə. negated() metodu işarəni dəyişir — müsbət mənfi olur və əksinə.
abs() metodu mütləq (müsbət) qiymətlə Duration qaytarır. isNegative() və isZero() — yoxlamalar. toDays(), toHours(), toMinutes(), toSeconds(), toMillis(), toNanos() — müvafiq vahidlərə çevirmə.
val oneHour = Duration.ofHours(1)
val twoHours = oneHour.plus(Duration.ofMinutes(60))
val halfHour = oneHour.dividedBy(2)
val minutes = twoHours.toMinutes()
val absDuration = (Duration.ofHours(-1)).abs()
Duration Comparable interfeysini tətbiq edir, bu da müddətləri təbii şəkildə müqayisə etməyə imkan verir. compareTo() metodu mənfi, sıfır və ya müsbət ədəd qaytarır. isNegative() və isZero() — sürətli yoxlamalar. Aşkar müqayisə üçün equals() istifadə edin — iki Duration eyni saniyə və nanosaniyələrə malikdirsə bərabərdir.
Duration mənfi ola bildiyindən, “böyük” və ya “kiçik” müqayisəsi işarə nəzərə alınmaqla işləyir. -5 dəqiqə 2 dəqiqədən kiçikdir. abs() metodu istiqamətdən asılı olmayaraq “mütləq” uzunluqları müqayisə etmək üçün faydalıdır.
Kotlin-də Duration operatorların yüklənməsi vasitəsilə müqayisə operatorlarını dəstəkləyir: a < b, a > b, a <= b. Həmçinin plus və minus operator kimi mövcuddur: a + b, a - b.
val short = Duration.ofMinutes(5)
val long = Duration.ofMinutes(10)
if (short < long) {
Log.d("Duration", "5 dəq 10-dan azdır")
}
val negative = Duration.ofMinutes(-3)
Log.d("Duration", "Mənfi: ${negative.isNegative()}")
Birinci nümunə — serverlə dövri sinxronizasiyanın qurulması. Duration sinxronizasiyalar arası intervalı hesablamaq və yeniləməsiz vaxt limitinin keçilib-keçilmədiyini yoxlamaq üçün istifadə olunur.
data class SyncConfig(
val interval: Duration = Duration.ofMinutes(15),
val retryDelay: Duration = Duration.ofSeconds(30)
)
fun calculateNextSync(
lastSync: Instant,
config: SyncConfig
): Duration {
val elapsed = Duration.between(lastSync, Instant.now())
return config.interval.minus(elapsed)
.coerceAtLeast(Duration.ZERO)
}
İkinci nümunə — performansı loqlamaq üçün əməliyyatın icra müddətinin ölçülməsi.
fun measureExecution(
tag: String,
block: () -> Unit
) {
val start = Instant.now()
block()
val duration = Duration.between(start, Instant.now())
Log.d(tag, "${duration.toMillis()} ms-də icra edildi")
}
Üçüncü nümunə — timer-in qalan vaxtının hesablanması (məsələn, aksiyanın bitməsinə qədər olan geri sayım).
class CountdownTimer(
private val expiresAt: Instant
) {
fun getRemainingTime(): Duration {
val remaining = Duration.between(
Instant.now(), expiresAt
)
return remaining.coerceAtLeast(Duration.ZERO)
}
fun isExpired(): Boolean = getRemainingTime() == Duration.ZERO
}
toString() metodu Duration-u ISO-8601 formatında qaytarır: “PT1H30M” (1 saat 30 dəqiqə), “PT45.5S” (45.5 saniyə). Bu format maşın mübadiləsi üçün əlverişlidir, lakin istifadəçiyə göstərmək üçün deyil.
İnsan tərəfindən oxuna bilən format üçün toDays(), toHours(), toMinutes(), toSeconds() istifadə edərək sətri əl ilə yığın. Məsələn: “${days} g ${hours} s ${minutes} dəq”. Qeyd edək ki, toHours() ümumi saat sayını qaytarır, gün ərzindəki saatları yox.
Duration-u komponentlərə bölmək üçün formula: val hours = duration.toHours(); val minutes = duration.toMinutes() % 60; val seconds = duration.seconds % 60. Apache Commons Lang (2024)-ə görə, DurationFormatUtils kitabxanası əlavə formatlaşdırma imkanları təqdim edir.
fun formatDuration(duration: Duration): String {
val hours = duration.toHours()
val minutes = duration.toMinutes() % 60
val seconds = duration.seconds % 60
return buildString {
if (hours > 0) append("${hours} h ")
if (minutes > 0) append("${minutes} min ")
append("${seconds} sec")
}
}
Birinci səhv — tarixlərlə işləyərkən Duration və Period-u qarışdırmaq. Duration saniyələri ölçür, buna görə Duration.ofDays(1) həmişə 24 saatdır (86400 saniyə), yay vaxtına keçiddən asılı olmayaraq. Təqvim günü lazımdırsa, Period.ofDays(1) istifadə edin.
İkinci səhv — çevirmə zamanı nanosaniyələrin itirilməsi. Duration nanosaniyələri saxlaya bilər, lakin toMillis() və toSeconds() onları atır. Dəqiq hesablamalar üçün toNanos() istifadə edin və ya Duration ilə birbaşa, primitivlərə çevirmədən işləyin.
Üçüncü səhv — mənfi Duration-ları nəzərə almamaq. Duration.between(start, end) start - end qaytarır. Əgər start end-dən sonradırsa, Duration mənfi olacaq. abs() metodu mütləq qiymət almağa, isNegative() isə arqumentlərin sırasını yoxlamağa kömək edir.
Dördüncü səhv — Duration-un UI üçün səhv formatlaşdırılması. Duration.toString() ISO-8601 qaytarır, bu oxunmazdır. Həmişə Duration-u istifadəçiyə göstərmək üçün əl ilə formatlayın, toHours(), toMinutes() və toSeconds() istifadə edərək düzgün qalıqla.
Tez-tez verilən suallar
Bəli, Duration mənfi ola bilər. Duration.between(start, end) start - end qaytarır. Start end-dən sonradırsa, Duration mənfi olacaq. Mütləq qiymət almaq üçün abs() və ya yoxlamaq üçün isNegative() istifadə edin.
plus(Duration) metodundan və ya Kotlin-də + operatorundan istifadə edin: duration1 + duration2. Nəticə — yeni Duration. minus(Duration) metodu bir müddəti digərindən çıxarır. Bütün əməliyyatlar dəyişməzdir və yeni obyekt qaytarır.
Duration.ofDays(1) həmişə 24 saatdır (86400 saniyə). Period.ofDays(1) isə DST zamanı 23 və ya 25 saat ola bilən 1 təqvim günüdür. Dəqiq vaxt hesablamaları üçün Duration, təqvim üçün Period istifadə edin.
toMillis() metodundan istifadə edin. Duration-dakı millisaniyələrin sayını qaytarır. Nanosaniyələr üçün toNanos() istifadə edin. Diqqət: toNanos() 292 ildən böyük qiymətlərdə long-u aşa bilər. Böyük Duration-lar üçün toSeconds() və ya toMinutes() istifadə edin.
Duration.between(startTime, endTime) istifadə edin. Əgər endTime startTime-dan kiçikdirsə (gecə növbəsi), Duration mənfi olacaq. 24 saat əlavə edin: duration.plusHours(24), əgər endTime növbəti gündürsə.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun