Duration — bu nədir, Android-də müddətin hesablanması

Müəllif: IT Sectr Dərc olunub: 2026-07-13 Oxuma vaxtı: 9 dəq

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ə müddəti ölçmək üçün dəyişməz sinif.
  • Period-dan fərqli olaraq, Duration zaman əsaslı vahidlərlə (saat, dəqiqə, saniyə) işləyir, tarix əsaslı (gün, ay, il) yox.
  • Duration.between(start, end), Duration.ofMinutes(), Duration.ofHours() və digər statik fabriklər vasitəsilə yaradılır.
  • Arifmetik əməliyyatları dəstəkləyir: plus(), minus(), multipliedBy(), dividedBy(), negated().
  • Android inkişafında Duration vaxt aşımları, sinxronizasiya intervalları və əməliyyat müddətlərini hesablamaq üçün əlverişlidir.

Duration nədir?

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, TemporalAmountTemporalUnit interfeyslərini tətbiq edir. TemporalAmount LocalTime, LocalDateTime, Instant və ZonedDateTime siniflərinin plus/minus metodlarında Duration-dan istifadə etməyə imkan verir.

Duration vs Period: fərq nədir?

Ə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.

Duration-un yaradılması

Ə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.

kotlin
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 ilə arifmetika

Duration tam arifmetik əməliyyatlar dəstini dəstəkləyir. plus(Duration)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ə.

kotlin
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-un müqayisəsi

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.

kotlin
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()}")

Android-in real tapşırıqlarında Duration

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.

kotlin
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.

kotlin
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).

kotlin
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
}

Duration-un sətirə çevrilməsi

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.

kotlin
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")
    }
}

Tipik səhvlər

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

Duration mənfi ola bilərmi?

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.

İki Duration-u necə toplamaq olar?

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) Period.ofDays(1)-dən nə ilə fərqlənir?

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.

Duration-u millisaniyələrə necə çevirmək olar?

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.

İki LocalTime arasında Duration-u necə hesablamaq olar?

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ə

  • Duration — nanosaniyə dəqiqliyi ilə zaman əsaslı müddəti ölçmək üçün dəyişməz sinif, intervalları ölçmək üçün idealdır.
  • Period-dan əsas fərq — Duration saniyələri (fiziki vaxt), Period isə təqvim vahidlərini ölçür.
  • Duration.between() vasitəsilə anlar arası fərq və ya ofMinutes, ofHours, ofDays statik fabrikləri ilə yaradılır.
  • Arifmetikanı dəstəkləyir: plus, minus, multipliedBy, dividedBy, həmçinin Comparable və abs vasitəsilə müqayisə.
  • Android-də Duration vaxt aşımları, sinxronizasiya intervalları, timerlər və performans ölçülməsi üçün tətbiq olunur.
  • İstifadəçiyə göstərərkən Duration-u əl ilə formatlayın — toString() ISO-8601 qaytarır, insan üçün oxunmaz.
  • Duration-un mənfi ola biləcəyini nəzərə alın — isNegative() yoxlayın və düzgün hesablamalar üçün abs() istifadə edin.

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.

Layihəni müzakirə et

Həm də oxuyun