Duration — nedir, Android’de süre hesaplama

Yazar: IT Sectr Yayınlanma: 2026-07-13 Okuma süresi: 9 dk

Duration — java.time paketinden, iki zaman anı arasındaki süreyi saniye ve nanosaniye cinsinden temsil eden değişmez bir sınıf. Duration, zamana dayalı zaman miktarlarını — saat, dakika, saniye, milisaniye ve nanosaniyeyi ölçer. Oracle Java 17 (2024) belirtimine göre, Period’un (yıl-ay-gün ölçer) aksine Duration, hassas zaman birimleriyle çalışır ve takvime bağlı değildir.

Önemli Noktalar

  • Duration — süreyi saniye ve nanosaniye cinsinden ölçmek için değişmez bir sınıf.
  • Period’un aksine Duration, zamana dayalı birimlerle (saat, dakika, saniye) çalışır, tarihe dayalı (gün, ay, yıl) değil.
  • Duration.between(start, end), Duration.ofMinutes(), Duration.ofHours() ve diğer statik fabrika metotlarıyla oluşturulur.
  • Aritmetik işlemleri destekler: plus(), minus(), multipliedBy(), dividedBy(), negated().
  • Android geliştirme için Duration, zaman aşımları, senkronizasyon aralıkları ve işlem sürelerini hesaplamada kullanışlıdır.

Duration nedir?

Duration, saniye ve nanosaniye cinsinden zaman miktarını modelleyen bir sınıftır. Takvime bağlı olmayan fiziksel saniye sayısı olan zamana dayalı bir süreyi temsil eder. Duration, “125 dakika” veya “2 saat 5 dakika” olarak düşünülebilir — Period ise “2 ay” derdi.

Duration’ın iç temsili iki alandan oluşur: long seconds (saniye) ve int nanos (nanosaniye, 0 ile 999999999 arası). Değer negatif olabilir — bu, zamanda “geriye” doğru bir süre anlamına gelir. Maksimum değer ±31557014167219200 saniyedir.

Baeldung (2024)’e göre Duration, işlem süresini hesaplamak, zaman aşımları ayarlamak ve performansı ölçmek için anahtar bir sınıftır. Duration değişmez ve iş parçacığı güvenlidir, bu da senkronizasyon olmadan çok iş parçacıklı ortamlarda kullanılmasına olanak tanır.

Sınıf, Comparable, TemporalAmount ve TemporalUnit arayüzlerini uygular. TemporalAmount, Duration’ın LocalTime, LocalDateTime, Instant ve ZonedDateTime sınıflarının plus/minus metotlarında kullanılmasına izin verir.

Duration vs Period: farkı nedir?

Temel fark, Duration’ın tam saniye sayısını (zamana dayalı) ölçmesi, Period’un ise takvim birimlerini (tarihe dayalı) ölçmesidir: yıl, ay, gün. Duration “86400 saniye geçti” der. Period “1 gün geçti” der. Fark, yaz saati uygulaması değişikliklerinde belirginleşir — Period’ta 1 gün her zaman 1 takvim günüdür, oysa Duration’da 86400 saniye DST sırasında 23 veya 25 saate karşılık gelebilir.

Duration, fiziksel zamanı ölçmek için kullanılır: bağlantı zaman aşımları, sorgu yürütme süresi, iki Instant arasındaki aralık. Period, takvim hesaplamaları için kullanılır: bir kişinin yaşı (Period.between(dateOfBirth, today)), sözleşme süresi.

Duration, saniye ve nanosaniye ile çalışır, bu nedenle parçalara (saat, dakika) bölünebilir. Period, yıl, ay ve gün ile çalışır — bölünemez takvim birimleri. Oracle Java Tutorial (2024)’e göre Duration ve Period arasındaki seçim, görev türüne bağlıdır: hassas zaman vs takvim tarihleri.

Duration oluşturma

En yaygın yöntem Duration.between(Temporal start, Temporal end)’dir. Temporal, Instant, LocalTime, LocalDateTime, ZonedDateTime — Temporal’ı uygulayan herhangi bir tür olabilir. Metot, start - end farkını temsil eden bir Duration döndürür (negatif olabilir).

Statik fabrika metotları: Duration.ofSeconds(long), ofMinutes(long), ofHours(long), ofDays(long), ofMillis(long), ofNanos(long). Rastgele birimler için of(long amount, TemporalUnit unit) da vardır — ChronoUnit.HOURS, ChronoUnit.MINUTES ve diğerleri.

parse(CharSequence) metodu ISO-8601 formatında bir dize kabul eder: “PT1H30M” (1 saat 30 dakika), “PT45S” (45 saniye), “P2DT3H” (2 gün 3 saat). Dize her zaman “PT” (Period of Time) ile başlar.

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 ile aritmetik

Duration, tam bir aritmetik işlem setini destekler. plus(Duration) ve minus(Duration) metotları başka bir süre ekler veya çıkarır. plusDays(), plusHours(), plusMinutes(), plusSeconds(), plusMillis(), plusNanos() metotları — belirli birimleri eklemek için.

Çarpma ve bölme için multipliedBy(long) ve dividedBy(long) kullanılır. Duration.multipliedBy(2) süreyi ikiye katlar. Duration.dividedBy(3) aşağı yuvarlayarak üç parçaya böler. negated() metodu işareti ters çevirir — pozitif negatif olur ve tersi.

abs() metodu mutlak (pozitif) değere sahip bir Duration döndürür. isNegative() ve isZero() kontrollerdir. toDays(), toHours(), toMinutes(), toSeconds(), toMillis(), toNanos() ilgili birimlere dönüştürür.

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 karşılaştırma

Duration, Comparable arayüzünü uygulayarak sürelerin doğal olarak karşılaştırılmasına olanak tanır. compareTo() metodu negatif bir sayı, sıfır veya pozitif bir sayı döndürür. isNegative() ve isZero() hızlı kontrollerdir. Açık karşılaştırma için equals() kullanın — iki Duration, saniye ve nanosaniyeleri eşleşiyorsa eşittir.

Duration negatif olabileceğinden, “büyüktür” veya “küçüktür” karşılaştırmaları işaret dikkate alınarak çalışır. -5 dakika, 2 dakikadan küçüktür. abs() metodu, yönden bağımsız olarak “mutlak” uzunlukları karşılaştırmak için kullanışlıdır.

Kotlin’de Duration, operatör aşırı yükleme yoluyla karşılaştırma operatörlerini destekler: a < b, a > b, a <= b. Ayrıca plus ve minus operatör olarak kullanılabilir: a + b, a - b.

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

if (short < long) {
    Log.d("Duration", "5 dakika 10’dan az")
}

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

Gerçek Android görevlerinde Duration

İlk örnek, sunucuyla periyodik senkronizasyonu yapılandırmaktır. Duration, senkronizasyonlar arasındaki aralığı hesaplamak ve güncelleme olmadan zaman sınırının aşılıp aşılmadığını kontrol etmek için kullanılır.

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 örnek, performans kaydı için bir işlemin yürütme süresini ölçmektir.

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 içinde yürütüldü")
}

Üçüncü örnek, bir zamanlayıcının kalan süresini hesaplamaktır (örneğin, bir promosyonun sonuna kadar 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’ı dizeye dönüştürme

toString() metodu, Duration’ı ISO-8601 formatında döndürür: “PT1H30M” (1 saat 30 dakika), “PT45.5S” (45.5 saniye). Bu format, makine alışverişi için uygundur ancak kullanıcı görüntülemesi için uygun değildir.

İnsan tarafından okunabilir format için toDays(), toHours(), toMinutes(), toSeconds() kullanın ve ardından dizeyi manuel olarak oluşturun. Örneğin: “${days} g ${hours} s ${minutes} dk”. toHours()’ın toplam saat sayısını döndürdüğünü, gün içindeki saatleri değil unutmayın.

Duration’ı bileşenlerine ayırmak için şu formülü kullanın: val hours = duration.toHours(); val minutes = duration.toMinutes() % 60; val seconds = duration.seconds % 60. Apache Commons Lang (2024)’e göre DurationFormatUtils kütüphanesi ek biçimlendirme yetenekleri sağlar.

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

Yaygın hatalar

İlk hata, tarihlerle çalışırken Duration ve Period’u karıştırmaktır. Duration saniyeyi ölçer, bu nedenle Duration.ofDays(1) her zaman 24 saattir (86400 saniye), yaz saati değişikliklerinden bağımsız olarak. Bir takvim gününe ihtiyacınız varsa Period.ofDays(1) kullanın.

İkinci hata, dönüştürme sırasında nanosaniyeleri kaybetmektir. Duration nanosaniyeleri depolayabilir, ancak toMillis() ve toSeconds() bunları atar. Hassas hesaplamalar için toNanos() kullanın veya ilkel türlere dönüştürmeden doğrudan Duration ile çalışın.

Üçüncü hata, negatif Duration’ı görmezden gelmektir. Duration.between(start, end) start - end döndürür. Eğer start end’den sonraysa Duration negatif olur. abs() metodu mutlak değeri almayı sağlar ve isNegative() argüman sırasını kontrol eder.

Dördüncü hata, kullanıcı arayüzü için yanlış Duration biçimlendirmesidir. Duration.toString() ISO-8601 döndürür ve okunamaz. Kullanıcıya göstermek için Duration’u her zaman toHours(), toMinutes() ve toSeconds() ile doğru bölme kalanını kullanarak manuel olarak biçimlendirin.

Sıkça Sorulan Sorular

Duration negatif olabilir mi?

Evet, Duration negatif olabilir. Duration.between(start, end) start - end döndürür. Eğer start end’den sonraysa Duration negatif olur. Mutlak değeri almak için abs() veya kontrol için isNegative() kullanın.

İki Duration nasıl toplanır?

plus(Duration) metodunu veya Kotlin’de + operatörünü kullanın: duration1 + duration2. Sonuç yeni bir Duration’dır. minus(Duration) metodu bir süreden diğerini çıkarır. Tüm işlemler değişmezdir ve yeni bir nesne döndürür.

Duration.ofDays(1), Period.ofDays(1)’den nasıl farklıdır?

Duration.ofDays(1) her zaman 24 saattir (86400 saniye). Period.ofDays(1) 1 takvim günüdür ve DST sırasında 23 veya 25 saat olabilir. Hassas zaman hesaplamaları için Duration’u, takvim hesaplamaları için Period’u kullanın.

Duration milisaniyeye nasıl dönüştürülür?

toMillis() metodunu kullanın. Bir long döndürür — Duration’daki milisaniye sayısı. Nanosaniyeler için toNanos() kullanın. Uyarı: toNanos() > 292 yıl değerlerinde long taşmasına neden olabilir. Büyük Duration’lar için toSeconds() veya toMinutes() kullanın.

İki LocalTime arasındaki Duration nasıl hesaplanır?

Duration.between(startTime, endTime) kullanın. Eğer endTime, startTime’dan küçükse (gece vardiyası), Duration negatif olur. endTime’ın ertesi gün olduğu varsayılırsa 24 saat ekleyin: duration.plusHours(24).

Özet

  • Duration — nanosaniye hassasiyetinde zamana dayalı süre için değişmez bir sınıf, aralık ölçümü için idealdir.
  • Period’dan temel fark — Duration saniyeyi (fiziksel zaman), Period takvim birimlerini ölçer.
  • Duration.between() ile anlar arasındaki fark için veya ofMinutes, ofHours, ofDays statik fabrikalarıyla oluşturulur.
  • Aritmetiği destekler: plus, minus, multipliedBy, dividedBy, ayrıca Comparable ve abs ile karşılaştırma.
  • Android’de Duration, zaman aşımları, senkronizasyon aralıkları, zamanlayıcılar ve performans ölçümü için kullanılır.
  • Kullanıcıya gösterirken Duration’u manuel biçimlendirin — toString() ISO-8601 çıktısı verir, insan tarafından okunamaz.
  • Duration’ın negatif olabileceğini unutmayın — isNegative() kontrol edin ve doğru hesaplamalar için abs() kullanın.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun