Duration — bu nima, Android-da davomiylikni hisoblash

Muallif: IT Sectr Nashr etilgan: 2026-07-13 O'qish vaqti: 9 daq

Duration — java.time paketidan olingan, ikki vaqt momenti orasidagi davomiylikni soniya va nanosekundalarda ifodalovchi o‘zgarmas sinf. Duration vaqtga asoslangan vaqt miqdorini — soatlar, daqiqalar, soniyalar, millisoniyalar va nanosoniyalarni o‘lchaydi. Oracle Java 17 (2024) spetsifikatsiyasiga ko‘ra, Period-dan (yil-oy-kun o‘lchaydigan) farqli o‘laroq, Duration aniq vaqt birliklari bilan ishlaydi va kalendarga bog‘liq emas.

Asosiy ma’lumotlar

  • Duration — soniya va nanosoniyalarda davomiylikni o‘lchash uchun o‘zgarmas sinf.
  • Period-dan farqli o‘laroq, Duration vaqtga asoslangan birliklar (soat, daqiqa, soniya) bilan ishlaydi, sanaga asoslangan (kun, oy, yil) emas.
  • Duration.between(start, end), Duration.ofMinutes(), Duration.ofHours() va boshqa statik fabrikalar orqali yaratiladi.
  • Arifmetik amallarni qo‘llab-quvvatlaydi: plus(), minus(), multipliedBy(), dividedBy(), negated().
  • Android rivojlanishi uchun Duration taym-autlar, sinxronizatsiya intervallari va operatsiyalar davomiyligini hisoblash uchun qulay.

Duration nima?

Duration — soniya va nanosoniyalarda vaqt miqdorini modellashtiruvchi sinf. U vaqtga asoslangan davomiylikni, ya‘ni kalendarga bog‘liq bo‘lmagan fizik soniyalar sonini ifodalaydi. Duration “125 daqiqa” yoki “2 soat 5 daqiqa” sifatida ko‘rsatilishi mumkin — Period-dan farqli o‘laroq, u “2 oy” deydi.

Duration ning ichki tuzilishi ikki maydondan iborat: long seconds (soniyalar) va int nanos (nanosoniyalar, 0 dan 999999999 gacha). Qiymat manfiy bo‘lishi mumkin — bu vaqtda “orqaga” davomiylikni anglatadi. Maksimal qiymat ±31557014167219200 soniya.

Baeldung (2024) ga ko‘ra, Duration operatsiya davomiyligini hisoblash, taym-autlarni sozlash va unumdorlikni o‘lchash uchun asosiy sinfdir. Duration o‘zgarmas va thread-safe, bu uni ko‘p tarmoqli muhitda sinxronizatsiyasiz ishlatishga imkon beradi.

Sinf Comparable, TemporalAmount va TemporalUnit interfeyslarini tatbiq qiladi. TemporalAmount LocalTime, LocalDateTime, Instant va ZonedDateTime sinflarining plus/minus metodlarida Duration dan foydalanishga imkon beradi.

Duration vs Period: farqi nimada?

Asosiy farq — Duration aniq soniya sonini (time-based), Period esa kalendar birliklarini (date-based): yil, oy, kun o‘lchaydi. Duration deydi: “86400 soniya o‘tdi”. Period deydi: “1 kun o‘tdi”. Farq yozgi vaqtga o‘tishda namoyon bo‘ladi — Period da 1 kun har doim kalendarda 1 kunga teng, Duration dagi 86400 soniya esa DST da 23 yoki 25 soatga mos kelishi mumkin.

Duration fizik vaqtni o‘lchash uchun ishlatiladi: ulanish taym-autlari, so‘rovni bajarish vaqti, ikki Instant orasidagi interval. Period kalendar hisoblari uchun ishlatiladi: insonning yoshi (Period.between(tug‘ilganSana, bugun)), shartnoma amal qilish muddati.

Duration soniya va nanosoniyalar bilan ishlaydi, shuning uchun uni qismlarga (soat, daqiqa) bo‘lish mumkin. Period yillar, oylar va kunlar bilan ishlaydi — bo‘linmaydigan kalendar birliklari. Oracle Java Tutorial (2024) ga ko‘ra, Duration va Period orasidagi tanlov vazifa turiga bog‘liq: aniq vaqt vs kalendar sanalari.

Duration yaratish

Eng keng tarqalgan usul — Duration.between(Temporal start, Temporal end). Temporal Instant, LocalTime, LocalDateTime, ZonedDateTime — Temporal ni tatbiq qiluvchi istalgan tip bo‘lishi mumkin. Metod start - end farqini ifodalovchi Duration qaytaradi (manfiy bo‘lishi mumkin).

Statik fabrik metodlari: Duration.ofSeconds(long), ofMinutes(long), ofHours(long), ofDays(long), ofMillis(long), ofNanos(long). Shuningdek, ixtiyoriy birliklar uchun of(long amount, TemporalUnit unit) mavjud — ChronoUnit.HOURS, ChronoUnit.MINUTES va boshqalar.

parse(CharSequence) metodi ISO-8601 formatidagi satrni qabul qiladi: “PT1H30M” (1 soat 30 daqiqa), “PT45S” (45 soniya), “P2DT3H” (2 kun 3 soat). Satr har doim “PT” (Period of Time) bilan boshlanadi.

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 bilan arifmetika

Duration to‘liq arifmetik amallar to‘plamini qo‘llab-quvvatlaydi. plus(Duration) va minus(Duration) metodlari boshqa davomiylikni qo‘shadi yoki ayiradi. plusDays(), plusHours(), plusMinutes(), plusSeconds(), plusMillis(), plusNanos() metodlari — birliklarni aniq qo‘shish uchun.

Ko‘paytirish va bo‘lish uchun multipliedBy(long) va dividedBy(long) ishlatiladi. Duration.multipliedBy(2) davomiylikni ikki baravar oshiradi. Duration.dividedBy(3) uch qismga bo‘ladi, pastga yaxlitlash bilan. negated() metodi belgini o‘zgartiradi — musbat manfiy bo‘ladi va aksincha.

abs() metodi mutlaq (musbat) qiymatga ega Duration qaytaradi. isNegative() va isZero() — tekshirishlar. toDays(), toHours(), toMinutes(), toSeconds(), toMillis(), toNanos() — tegishli birliklarga o‘tkazish.

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 ni solishtirish

Duration Comparable interfeysini tatbiq qiladi, bu davomiyliklarni tabiiy ravishda solishtirishga imkon beradi. compareTo() metodi manfiy son, nol yoki musbat son qaytaradi. isNegative() va isZero() — tezkor tekshirishlar. Aniq solishtirish uchun equals() dan foydalaning — ikki Duration bir xil soniya va nanosoniyalarga ega bo‘lsa teng.

Duration manfiy bo‘lishi mumkinligi sababli, “katta” yoki “kichik” solishtirish belgi hisobga olingan holda ishlaydi. -5 daqiqa 2 daqiqadan kichik. abs() metodi yo‘nalishdan qat‘i nazar “mutlaq” uzunliklarni solishtirish uchun foydali.

Kotlin da Duration operatorlarni yuklash orqali solishtirish operatorlarini qo‘llab-quvvatlaydi: a < b, a > b, a <= b. Shuningdek, plus va minus operator sifatida mavjud: a + b, a - b.

kotlin
val short = Duration.ofMinutes(5)
val long = Duration.ofMinutes(10)

if (short < long) {
    Log.d("Duration", "5 daqiqa 10 dan kam")
}

val negative = Duration.ofMinutes(-3)
Log.d("Duration", "Salbiy: ${negative.isNegative()}")

Duration Android ning real vazifalarida

Birinchi misol — server bilan davriy sinxronizatsiyani sozlash. Duration sinxronizatsiyalar orasidagi intervalni hisoblash va yangilanishsiz vaqt limiti oshib ketganligini tekshirish uchun ishlatiladi.

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

Ikkinchi misol — unumdorlikni loglash uchun operatsiyani bajarish vaqtini o‘lchash.

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 da bajarildi")
}

Uchinchi misol — taymerning qolgan vaqtini hisoblash (masalan, aksiya tugashigacha bo‘lgan orqaga hisoblash).

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 ni satrga aylantirish

toString() metodi Duration ni ISO-8601 formatida qaytaradi: “PT1H30M” (1 soat 30 daqiqa), “PT45.5S” (45.5 soniya). Bu format mashina almashinuvi uchun qulay, lekin foydalanuvchiga ko‘rsatish uchun emas.

Inson o‘qiy oladigan format uchun toDays(), toHours(), toMinutes(), toSeconds() dan foydalanib satrni qo‘lda yig‘ing. Masalan: “${days} k ${hours} soat ${minutes} daq”. Eslatma: toHours() umumiy soat sonini qaytaradi, kun ichidagi soatlarni emas.

Duration ni komponentlarga bo‘lish uchun formula: val hours = duration.toHours(); val minutes = duration.toMinutes() % 60; val seconds = duration.seconds % 60. Apache Commons Lang (2024) ga ko‘ra, DurationFormatUtils kutubxonasi qo‘shimcha formatlash imkoniyatlarini taqdim etadi.

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

Oddiy xatolar

Birinchi xato — sanalar bilan ishlashda Duration va Period ni adashtirish. Duration soniyalarni o‘lchaydi, shuning uchun Duration.ofDays(1) har doim 24 soat (86400 soniya), yozgi vaqtga o‘tishdan qat‘i nazar. Agar kalendar kuni kerak bo‘lsa, Period.ofDays(1) dan foydalaning.

Ikkinchi xato — aylantirishda nanosoniyalarning yo‘qolishi. Duration nanosoniyalarni saqlashi mumkin, lekin toMillis() va toSeconds() ularni tashlab yuboradi. Aniq hisoblar uchun toNanos() dan foydalaning yoki Duration bilan to‘g‘ridan-to‘g‘ri, primitiv turlarga o‘tkazmasdan ishlang.

Uchinchi xato — manfiy Duration larni e’tiborsiz qoldirish. Duration.between(start, end) start - end qaytaradi. Agar start end dan keyin bo‘lsa, Duration manfiy bo‘ladi. abs() metodi mutlaq qiymat olishga, isNegative() esa argumentlar tartibini tekshirishga yordam beradi.

To‘rtinchi xato — Duration ni UI uchun noto‘g‘ri formatlash. Duration.toString() ISO-8601 qaytaradi, bu o‘qib bo‘lmaydi. Har doim Duration ni foydalanuvchiga ko‘rsatish uchun qo‘lda formatlang, toHours(), toMinutes() va toSeconds() ni to‘g‘ri qoldiq bilan ishlatib.

Tez-tez beriladigan savollar

Duration manfiy bo‘lishi mumkinmi?

Ha, Duration manfiy bo‘lishi mumkin. Duration.between(start, end) start - end qaytaradi. Agar start end dan keyin bo‘lsa, Duration manfiy bo‘ladi. Mutlaq qiymat olish uchun abs() yoki tekshirish uchun isNegative() dan foydalaning.

Ikki Duration ni qanday qo‘shish mumkin?

plus(Duration) metodidan yoki Kotlin dagi + operatoridan foydalaning: duration1 + duration2. Natija — yangi Duration. minus(Duration) metodi bir davomiylikni boshqasidan ayiradi. Barcha amallar o‘zgarmas va yangi obyekt qaytaradi.

Duration.ofDays(1) Period.ofDays(1) dan nimasi bilan farq qiladi?

Duration.ofDays(1) har doim 24 soat (86400 soniya). Period.ofDays(1) DST da 23 yoki 25 soat bo‘lishi mumkin bo‘lgan 1 kalendar kun. Aniq vaqt hisoblari uchun Duration, kalendar hisoblari uchun Period dan foydalaning.

Duration ni millisoniyalarga qanday aylantirish mumkin?

toMillis() metodidan foydalaning. Duration dagi millisoniyalar sonini long sifatida qaytaradi. Nanosoniyalar uchun toNanos() dan foydalaning. Diqqat: toNanos() 292 yildan katta qiymatlarda long ni to‘ldirishi mumkin. Katta Duration lar uchun toSeconds() yoki toMinutes() dan foydalaning.

Ikki LocalTime orasidagi Duration ni qanday hisoblash mumkin?

Duration.between(startTime, endTime) dan foydalaning. Agar endTime startTime dan kichik bo‘lsa (tungi smena), Duration manfiy bo‘ladi. 24 soat qo‘shing: duration.plusHours(24), agar endTime keyingi kun deb hisoblansa.

Xulosa

  • Duration — nanosoniya aniqligi bilan vaqtga asoslangan davomiylikni o‘lchash uchun o‘zgarmas sinf, intervallarni o‘lchash uchun ideal.
  • Period dan asosiy farq — Duration soniyalarni (fizik vaqt), Period kalendar birliklarini o‘lchaydi.
  • Duration.between() orqali momentlar orasidagi farq yoki ofMinutes, ofHours, ofDays statik fabrikalari orqali yaratiladi.
  • Arifmetikani qo‘llab-quvvatlaydi: plus, minus, multipliedBy, dividedBy, shuningdek Comparable va abs orqali solishtirish.
  • Android da Duration taym-autlar, sinxronizatsiya intervallari, taymerlar va unumdorlikni o‘lchash uchun qo‘llaniladi.
  • Foydalanuvchiga ko‘rsatishda Duration ni qo‘lda formatlang — toString() ISO-8601 qaytaradi, inson uchun o‘qib bo‘lmaydi.
  • Duration manfiy bo‘lishi mumkinligini yodda tuting — isNegative() ni tekshiring va to‘g‘ri hisoblar uchun abs() dan foydalaning.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing