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 দিন পেরিয়ে গেছে।” ডেলাইট সেভিং টাইম পরিবর্তনের সময় পার্থক্য স্পষ্ট হয় — 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()} মিলিসেকেন্ডে নিষ্পাদিত")
}
তৃতীয় উদাহরণ হল টাইমারের অবশিষ্ট সময় গণনা করা (উদাহরণস্বরূপ, প্রচার শেষ হওয়া পর্যন্ত কাউন্টডাউন)।
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() মেথড ISO-8601 ফরম্যাটে Duration ফেরত দেয়: “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() আর্গুমেন্ট অর্ডার পরীক্ষা করে।
চতুর্থ ভুল হল UI এর জন্য ভুল 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন