Duration — шта је, израчунавање трајања у Android-у

Аутор: IT Sectr Објављено: 2026-07-13 Време читања: 9 мин

Duration — непромјењива класа из пакета java.time, која представља трајање између два тренутка у секундама и наносекундама. Duration мери временски засновану количину времена — сате, минуте, секунде, милисекунде и наносекунде. Према спецификацији Oracle Java 17 (2024), за разлику од Period-а (који мери године-месеце-дане), Duration ради са прецизним јединицама времена и не зависи од календара.

Главно

  • Duration — непромјењива класа за мерење трајања у секундама и наносекундама.
  • За разлику од Period-а, Duration ради са временски заснованим јединицама (сати, минути, секунде), а не са датумски (дани, месеци, године).
  • Ствара се путем Duration.between(start, end), Duration.ofMinutes(), Duration.ofHours() и других статичких фабрика.
  • Подржава аритметичке операције: plus(), minus(), multipliedBy(), dividedBy(), negated().
  • За Android развој, Duration је згодан за израчунавање тајмаута, интервала синхронизације и трајања операција.

Шта је Duration?

Duration — је класа која моделира количину времена у секундама и наносекундама. Она представља временски засновано трајање, односно физички број секунди, који није везан за календар. Duration се може представити као „125 минута” или „2 сата 5 минута” — за разлику од Period-а, који ће рећи „2 месеца”.

Унутрашња репрезентација Duration-а састоји се од два поља: long seconds (секунде) и int nanos (наносекунде, од 0 до 999999999). Вредност може бити негативна — то значи трајање „уназад” у времену. Максимална вредност је ±31557014167219200 секунди.

Према Baeldung (2024), Duration је кључна класа за израчунавање трајања операција, подешавање тајмаута и мерење перформанси. Duration је непромјењива и thread-safe, што омогућава њено кориштење у вишенитном окружењу без синхронизације.

Класа имплементира интерфејсе Comparable, TemporalAmount и TemporalUnit. TemporalAmount омогућава кориштење Duration-а у методама plus/minus класа LocalTime, LocalDateTime, Instant и ZonedDateTime.

Duration vs Period: која је разлика?

Главна разлика — Duration мери тачан број секунди (time-based), а Period мери календарске јединице (date-based): године, месеце, дане. Duration каже: „прошло је 86400 секунди”. Period каже: „прошао је 1 дан”. Разлика се појављује при преласку на летње време — 1 дан у Period-у је увек једнак 1 дану у календару, а 86400 секунди у Duration-у могу одговарати 23 или 25 сати при DST.

Duration се користи за мерење физичког времена: тајмаути везе, време извршавања упита, интервал између два Instant-а. Period се користи за календарске израчуне: старост особе (Period.between(датумРођења, данас)), период важења уговора.

Duration ради са секундама и наносекундама, па се може делити на делове (сати, минуте). Period ради са годинама, месецима и данима — недељивим календарским јединицама. Према Oracle Java Tutorial (2024), избор између Duration и Period зависи од типа задатка: тачно време vs календарски датуми.

Креирање Duration

Најчешћи начин — Duration.between(Temporal start, Temporal end). Temporal може бити Instant, LocalTime, LocalDateTime, ZonedDateTime — било који тип који имплементира Temporal. Метода враћа Duration која представља разлику start - end (може бити негативна).

Статичке фабричке методе: Duration.ofSeconds(long), ofMinutes(long), ofHours(long), ofDays(long), ofMillis(long), ofNanos(long). Постоји и of(long amount, TemporalUnit unit) за произвољне јединице — ChronoUnit.HOURS, ChronoUnit.MINUTES и други.

Метода parse(CharSequence) прихвата стринг у ISO-8601 формату: „PT1H30M” (1 сат 30 минута), „PT45S” (45 секунди), „P2DT3H” (2 дана 3 сата). Стринг увек почиње са „PT” (Period of Time).

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

Duration подржава пун сет аритметичких операција. Методе plus(Duration) и minus(Duration) додају или одузимају друго трајање. Методе plusDays(), plusHours(), plusMinutes(), plusSeconds(), plusMillis(), plusNanos() — за прецизно додавање јединица.

За множење и дељење користе се multipliedBy(long) и dividedBy(long). Duration.multipliedBy(2) удвострује трајање. Duration.dividedBy(3) дели на три дела са заокругљивањем надоле. Метода negated() инвертује предзнак — позитивна постаје негативна и обрнуто.

Метода abs() враћа Duration са апсолутном (позитивном) вредношћу. isNegative() и isZero() — провере. toDays(), toHours(), toMinutes(), toSeconds(), toMillis(), toNanos() — конверзија у одговарајуће јединице.

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

Duration имплементира интерфејс Comparable, што омогућава природно поређење трајања. Метода compareTo() враћа негативан број, нулу или позитиван. Методе isNegative() и isZero() — брзе провере. За експлицитно поређење користите equals() — два Duration-а су једнака ако имају исте секунде и наносекунде.

Будући да Duration може бити негативно, поређење „већи” или „мањи” ради са узимајући у обзир предзнак. -5 минута је мање од 2 минута. Метода abs() је корисна ако треба да упоредите „апсолутне” дужине независно од смера.

U Kotlinu, Duration подржава операторе поређења кроз преоптерећивање оператора: a < b, a > b, a <= b. Такође су plus и minus доступни као оператори: a + b, a - b.

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

if (short < long) {
    Log.d("Duration", "5 мин је мање од 10")
}

val negative = Duration.ofMinutes(-3)
Log.d("Duration", "Негативан: ${negative.isNegative()}")

Duration у реалним задацима Android-а

Први примјер — подешавање периодичне синхронизације са сервером. Duration се користи за израчунавање интервала између синхронизација и провере да ли је прекорачен лимит времена без ажурирања.

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

Други примјер — мерење времена извршавања операције за логовање перформанси.

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

Трећи примјер — израчунавање преосталог времена тајмера (на примјер, за одбројавање до краја акције).

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 у стринг

Метода toString() враћа Duration у ISO-8601 формату: „PT1H30M” (1 сат 30 минута), „PT45.5S” (45.5 секунди). Овај формат је згодан за машинску размену, али не за приказ кориснику.

За формат читљив за људе користите toDays(), toHours(), toMinutes(), toSeconds() са ручним састављањем стринга. На примјер: „${days} d ${hours} ч ${minutes} мин”. Имајте у виду да toHours() враћа укупан број сати, а не сате у оквиру дана.

За растављање Duration-а на компоненте користи се формула: val hours = duration.toHours(); val minutes = duration.toMinutes() % 60; val seconds = duration.seconds % 60. Према Apache Commons Lang (2024), библиотека DurationFormatUtils пружа додатне могућности форматирања.

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

Типичне грешке

Прва грешка — мешање Duration и Period при раду са датумима. Duration мери секунде, па је Duration.ofDays(1) увек 24 сата (86400 секунди), без обзира на прелазак на летње време. Ако вам је потребан календарски дан, користите Period.ofDays(1).

Друга грешка — губитак наносекунди при конверзији. Duration може да чува наносекунде, али toMillis() и toSeconds() их одбацују. За прецизне израчуне користите toNanos() или радите директно са Duration, без конверзије у примитивне типове.

Трећа грешка — игнорисање негативних Duration. Duration.between(start, end) враћа start - end. Ако је start послије end-а, Duration ће бити негативна. Метода abs() помаже да се добије апсолутна вредност, а isNegative() — да се провери редослед аргумената.

Четврта грешка — неправилно форматирање Duration за UI. Duration.toString() враћа ISO-8601, који је нечитљив. Увек форматирајте Duration ручно за приказ кориснику, користећи toHours(), toMinutes() и toSeconds() са правилним остатком од дељења.

Често постављана питања

Може ли Duration бити негативно?

Да, Duration може бити негативно. Duration.between(start, end) враћа start - end. Ако је start послије end-а, Duration ће бити негативна. Користите abs() за добијање апсолутне вредности или isNegative() за проверу.

Како сабрати два Duration-а?

Користите методу plus(Duration) или оператор + у Kotlin-у: duration1 + duration2. Резултат — нови Duration. Метода minus(Duration) одузима једно трајање од другог. Све операције су непромјењиве и враћају нови објекат.

По чему се Duration.ofDays(1) разликује од Period.ofDays(1)?

Duration.ofDays(1) је увек 24 сата (86400 секунди). Period.ofDays(1) је 1 календарски дан који при DST може бити 23 или 25 сати. За израчуне са тачним временом користите Duration, за календарске — Period.

Како претворити Duration у милисекунде?

Користите методу toMillis(). Враћа long — број милисекунди у Duration-у. За наносекунде користите toNanos(). Пажња: toNanos() може премашити long при вредностима > 292 године. За велике Duration користите toSeconds() или toMinutes().

Како израчунати Duration између два LocalTime-а?

Користите Duration.between(startTime, endTime). Ако је endTime мањи од startTime (ноћна смена), Duration ће бити негативна. Додајте 24 сата: duration.plusHours(24), ако претпостављате да је endTime следећи дан.

Закључак

  • Duration — непромјењива класа за временски засновану дужину са прецизношћу наносекунди, идеална за мерење интервала.
  • Главна разлика од Period — Duration мери секунде (физичко време), Period — календарске јединице.
  • Ствара се путем Duration.between() за разлику између тренутака или статичким фабрикама ofMinutes, ofHours, ofDays.
  • Подржава аритметику: plus, minus, multipliedBy, dividedBy, као и поређење кроз Comparable и abs.
  • U Android-у, Duration се примењује за израчунавање тајмаута, интервала синхронизације, тајмера и мерења перформанси.
  • При приказу кориснику форматирајте Duration ручно — toString() враћа ISO-8601, нечитљив за људе.
  • Имајте у виду да Duration може бити негативно — проверавајте isNegative() и користите abs() за коректне израчуне.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође