Duration — java.time پیکیج سے ایک ناقابل تغیر کلاس جو سیکنڈ اور نینو سیکنڈ میں وقت کے دو لمحوں کے درمیان میاد کی نمائندگی کرتا ہے۔ Duration وقت پر مبنی وقت کی مقداروں — گھنٹے، منٹ، سیکنڈ، ملی سیکنڈ اور نینو سیکنڈ کو ناپتا ہے۔ Oracle Java 17 (2024) کی وضاحت کے مطابق، Period (جو سال-ماہ-دن ناپتا ہے) کے برعکس، Duration عین وقت کی اکائیوں کے ساتھ کام کرتا ہے اور کیلنڈر پر منحصر نہیں ہے۔
اہم نکات
Duration ایک کلاس ہے جو سیکنڈ اور نینو سیکنڈ میں وقت کی مقدار کو موڈل کرتا ہے۔ یہ وقت پر مبنی میاد کی نمائندگی کرتا ہے، یعنی سیکنڈ کی ایک طبیعی مقدار جو کیلنڈر سے منسلک نہیں ہے۔ Duration کو «125 منٹ» یا «2 گھنٹے 5 منٹ» کے طور پر سوچا جا سکتا ہے — Period کے برعکس جو «2 ماہ» کہے گا۔
Duration کی اندرونی نمائندگی دو فیلڈز پر مشتمل ہے: long seconds (سیکنڈ) اور int nanos (نینو سیکنڈ، 0 سے 999999999 تک)۔ قیمت منفی ہو سکتی ہے — اس کا مطلب وقت میں “پیچہ” کی جانے والی میاد ہے۔ انتہائی قیمت ±31557014167219200 سیکنڈ ہے۔
Baeldung (2024) کے مطابق، Duration کاروائی کی میاد کا حساب لگانے، ٹائم آؤٹ مقرر کرنے اور کارکردگی ناپنے کے لیے ایک کلیدی کلاس ہے۔ Duration ناقابل تغیر اور تھریڈ سیف ہے، جو بغیر مطابقت کے ملٹی تھریڈ ماحول میں استعمال کی اجازت دیتا ہے۔
یہ کلاس Comparable، TemporalAmount اور TemporalUnit انٹرفیسز کو نفذ کرتا ہے۔ TemporalAmount Duration کو LocalTime، LocalDateTime، Instant اور ZonedDateTime کلاسز کے plus/minus میٹہڈز میں استعمال کرنے کی اجازت دیتا ہے۔
بنیادی فرق یہ ہے کہ Duration سیکنڈ کی عین تعداد (وقت پر مبنی) کو ناپتا ہے، جبکہ Period کیلنڈر کی اکائیوں (تاریخ پر مبنی) کو ناپتا ہے: سال، ماہ، دن۔ Duration کہتا ہے: «86400 سیکنڈ گزر چکے۔» Period کہتا ہے: «1 دن گزر چکا ہے۔» فرق ڈے لائٹ سیونگ ٹائم (DST) کی تبدیلیوں کے دوران ظاہر ہوتا ہے — Period میں 1 دن ہمیشہ 1 کیلنڈر دن ہوتا ہے، جبکہ Duration میں 86400 سیکنڈ DST کے دوران 23 یا 25 گھنٹوں کے مساوی ہو سکتے ہیں۔
Duration طبیعی وقت کی پیمائش کے لیے استعمال کی جاتی ہے: کنکشن ٹائم آؤٹ، کوئری پر عمل کا وقت، دو Instant کے درمیان وقفہ۔ Period کیلنڈر حسابوں کے لیے استعمال کی جاتی ہے: کسی شخص کی عمر (Period.between(dateOfBirth, today))، معاہدے کی میاد۔
Duration سیکنڈ اور نینو سیکنڈ کے ساتھ کام کرتا ہے، لہذا اسے حصون (گھنٹے، منٹ) میں تقسیم کیا جا سکتا ہے۔ Period سالوں، ماہوں اور دنوں کے ساتھ کام کرتا ہے — ناقابل تقسیم کیلنڈر اکائیوں۔ Oracle Java Tutorial (2024) کے مطابق، Duration اور Period کے درمیان انتخاب کام کی قسم پر منحصر کرتا ہے: عین وقت بنام کیلنڈر تاریخ۔
سب سے عام طریقہ Duration.between(Temporal start, Temporal end) ہے۔ Temporal Instant، LocalTime، LocalDateTime، ZonedDateTime — کوئی بھی قسم جو Temporal کو نفذ کرتی ہو، ہو سکتی ہے۔ یہ میٹہڈ start - end کا فرق ظاہر کرتے ہوئے ایک Duration واپس کرتا ہے (منفی ہو سکتا ہے)۔
ستیٹک فیکٹری میٹہڈ: 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) سے شروع ہوتی ہے۔
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 ریاضی کاروائی کا ایک مکمل سیٹ کو سپورٹ کرتا ہے۔ 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() متبادل اکائیوں میں تبدیل کرتے ہیں۔
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 انٹرفیس کو نفذ کرتا ہے، جو میادوں کا قدرتی طور پر موازنہ کرنے کی اجازت دیتا ہے۔ compareTo() میٹہڈ ایک منفی عدد، صفر یا موجب عدد واپس کرتا ہے۔ isNegative() اور isZero() تیز جانچ کے لیے ہیں۔ صریح موازنے کے لیے equals() استعمال کریں — دو Duration برابر ہیں اگر ان کے سیکنڈ اور نینو سیکنڈ مطابقت کرتے ہیں۔
چونکہ Duration منفی ہو سکتا ہے، “بڑا” یا “چہوٹا” کا موازنہ نشان کو مدنظر رکھتے ہوئے کام کرتا ہے۔ -5 منٹ 2 منٹ سے چہوٹا ہے۔ abs() میٹہڈ سمت سے آزاد “مطلقی” لمبائی کا موازنہ کرنے کے لیے مفید ہے۔
Kotlin میں، Duration آپریٹر اوورلوڈنگ کے ذریعے موازنے کے آپریٹرز کو سپورٹ کرتا ہے: a < b، a > b، a <= b۔ ساتھ ہی plus اور minus بھی آپریٹرز کے طور پر دستیاب ہیں: a + b، a - b۔
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 کو مطابقات کے درمیان وقفہ کا حساب لگانے اور بغیر اپڈیٹ کے وقت کی حد کے بڑهنے کی جانچ کے لیے استعمال کیا جاتا ہے۔
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)
}
دوسری مثال کارکردگی لاگ کے لیے کاروائی کے عمل کے وقت کو ناپنا ہے۔
fun measureExecution(
tag: String,
block: () -> Unit
) {
val start = Instant.now()
block()
val duration = Duration.between(start, Instant.now())
Log.d(tag, "${duration.toMillis()} ms میں عمل کیا گیا")
}
تیسری مثال ڈائمر کے باقی وقت کا حساب لگانا ہے (مثال: پروموشن کے اختتام تک الٹی گنتی)۔
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() میٹہڈ Duration کو ISO-8601 فارمیٹ میں واپس کرتا ہے: «PT1H30M» (1 گھنٹا 30 منٹ)، «PT45.5S» (45.5 سیکنڈ)۔ یہ فارمیٹ مشینوں کے درمیان تبادلے کے لیے سهول ہے لیکن صارف کو دکھانے کے لیے نہیں۔
انسانی مطالعے کے قابل فارمیٹ کے لیے، toDays()، toHours()، toMinutes()، toSeconds() استعمال کریں اور پھر سے سٹرنگ بنائیں۔ مثال: «${days} دن ${hours} گھ ${minutes} منٹ»۔ یاد رکھیں کہ toHours() کل گھنٹوں کی تعداد واپس کرتا ہے، دن کے اندر گھنٹے نہیں۔
Duration کو اجزاء میں تقسیم کرنے کے لیے فارمولا استعمال کریں: val hours = duration.toHours(); val minutes = duration.toMinutes() % 60; val seconds = duration.seconds % 60۔ Apache Commons Lang (2024) کے مطابق، DurationFormatUtils لائبریری اضافی فارمیٹنگ کی صلاحیتیں فراہم کرتی ہے۔
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 فارمیٹنگ ہے۔ Duration.toString() ISO-8601 واپس کرتا ہے جو قابل مطالعہ نہیں ہے۔ صارف کو دکھانے کے لیے toHours()، toMinutes() اور toSeconds() کا استعمال کرکے مناسب تقسیم کے باقی کے ساتھ Duration کو همیشہ دستی طور پر فارمیٹ کریں۔
اکثر پوچہ جانے والے سوالات
جی ہاں، Duration منفی ہو سکتا ہے۔ Duration.between(start, end) start - end واپس کرتا ہے۔ اگر start end کے بعد ہے تو Duration منفی ہو گا۔ مطلق قیمت کے لیے abs() یا جانچ کے لیے isNegative() استعمال کریں۔
plus(Duration) میٹہڈ یا Kotlin میں + آپریٹر استعمال کریں: duration1 + duration2۔ نتیجہ ایک نیا Duration ہے۔ minus(Duration) میٹہڈ ایک میاد کو دوسری سے منفی کرتا ہے۔ تمام کاروائیاں ناقابل تغیر ہوتی ہیں اور ایک نیا آبجیکٹ واپس کرتی ہیں۔
Duration.ofDays(1) ہمیشہ 24 گھنٹے (86400 سیکنڈ) ہۋتا ہے۔ Period.ofDays(1) 1 کیلنڈر دن ہے جو DST کے دوران 23 یا 25 گھنٹے ہو سکتا ہے۔ عین وقت کے حسابوں کے لیے Duration استعمال کریں، کیلنڈر حسابوں کے لیے Period۔
toMillis() میٹہڈ استعمال کریں۔ یہ ایک long واپس کرتا ہے — Duration میں ملی سیکنڈ کی تعداد۔ نینو سیکنڈ کے لیے toNanos() استعمال کریں۔ انتباہ: toNanos() > 292 سال کی قیمتوں پر long کو اوربھاو کر سکتا ہے۔ بڑی Duration کے لیے toSeconds() یا toMinutes() استعمال کریں۔
Duration.between(startTime, endTime) استعمال کریں۔ اگر endTime startTime سے چہوٹا ہے (رات کی شفٹ)، تو Duration منفی ہو گا۔ 24 گھنٹے شامل کریں: duration.plusHours(24)، اگر endTime اگلے دن کو مانا جاتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں