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, 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.
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.
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.
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, 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.
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 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.
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()}")
İ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.
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.
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).
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() 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.
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")
}
}
İ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
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.
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) 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.
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.
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
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.
Ayrıca okuyun