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 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.
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.
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.
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 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.
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 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.
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()}")
Birinchi misol — server bilan davriy sinxronizatsiyani sozlash. Duration sinxronizatsiyalar orasidagi intervalni hisoblash va yangilanishsiz vaqt limiti oshib ketganligini tekshirish uchun ishlatiladi.
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.
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).
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() 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.
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")
}
}
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
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.
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) 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.
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.
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
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.