ThreeTenABP: এটি কী, Android এর জন্য java.time লাইব্রেরি

লেখক: IT Sectr প্রকাশিত: 2026-07-14 পড়ার সময়: 11 মিনিট

ThreeTenABP হল Android এর জন্য একটি অ্যাডাপ্টার লাইব্রেরি যা Android 8 (API < 26) এর নীচে ডিভাইসগুলিতে java.time API (org.threeten.bp প্যাকেজ) প্রদান করে। Jake Wharton (GitHub, 2023) এর স্পেসিফিকেশন অনুযায়ী, লাইব্রেরিটি ThreeTen-Backport প্রকল্পের উপর একটি র্যাপার, যা রিসোর্স অপ্টিমাইজেশন এবং AssetManager এর মাধ্যমে tzdata সমর্থন সহ Android এর জন্য অভিযোজিত।

মূল বিষয়

  • ThreeTenABP হল ThreeTen-Backport এর জন্য একটি Android অ্যাডাপ্টার, যা API < 26 এ java.time প্রদান করে।
  • Gradle এর মাধ্যমে যোগ করা হয়: implementation "com.jakewharton.threetenabp:threetenabp:1.4.x"।
  • Application.onCreate() এ AndroidThreeTen.init(this) এর মাধ্যমে ইনিশিয়ালাইজেশন প্রয়োজন।
  • java.time এর পরিবর্তে org.threeten.bp প্যাকেজ ব্যবহার করে — API প্রায় একই।
  • desugaring (AGP 4.0+) আসার সাথে, ThreeTenABP ঐচ্ছিক হয়ে গেছে এবং লিগ্যাসি প্রকল্পের জন্য ব্যবহৃত হয়।

ThreeTenABP কী?

ThreeTenABP (ThreeTen Android Backport) হল Jake Wharton দ্বারা তৈরি একটি লাইব্রেরি যা পুরানো Android সংস্করণে Java 8 এর তারিখ/সময় API ব্যবহারের অনুমতি দেয়। এটি ThreeTen-Backport প্রকল্পের জন্য একটি অ্যাডাপ্টার, যা java.time (JSR-310) কে Java 7 এবং Android API < 26 এ পোর্ট করে।

লাইব্রেরিটি যে প্রধান সমস্যার সমাধান করে: Android সংস্করণ 8 (API 26) এর আগে java.time স্ট্যান্ডার্ড ডিস্ট্রিবিউশনে অন্তর্ভুক্ত ছিল না। ডেভেলপাররা java.util.Date/Calendar ব্যবহার করতে বা Joda-Time যোগ করতে বাধ্য ছিলেন। ThreeTenABP বিল্ট-ইন java.time এর মতো একই আধুনিক API প্রদান করে, কিন্তু org.threeten.bp প্যাকেজের মাধ্যমে।

GitHub রিপোজিটরি (2023) অনুযায়ী, লাইব্রেরিটি Android এর জন্য অপ্টিমাইজড: tzdata (IANA Time Zone Database) assets এ সংরক্ষিত এবং ডেস্কটপের মতো classpath এর পরিবর্তে AssetManager এর মাধ্যমে লোড করা হয়। এটি APK সাইজ কমায় এবং লোডিং গতি বাড়ায়।

সর্বশেষ স্থিতিশীল সংস্করণ 1.4.0 (আগস্ট 2021)। লাইব্রেরিটি রক্ষণাবেক্ষণ মোডে রয়েছে, কারণ desugaring এর ব্যাপক গ্রহণের সাথে এর প্রয়োজনীয়তা হ্রাস পাচ্ছে, তবে এটি ন্যূনতম API < 25 সহ প্রকল্পগুলির জন্য প্রাসঙ্গিক রয়ে গেছে।

কেন java.time backport প্রয়োজন?

Java 8 (2014) এ java.time চালু হওয়ার আগে, ডেভেলপাররা java.util.Date এবং java.util.Calendar ব্যবহার করত। এই ক্লাসগুলির গুরুতর ত্রুটি রয়েছে: Date পরিবর্তনশীল, Calendar অ-স্বজ্ঞাত কনস্ট্যান্ট ব্যবহার করে (Calendar.JANUARY = 0), উভয় ক্লাসই থ্রেড-সেফ নয় এবং সময় অঞ্চল নিয়ে কাজ করার সময় ত্রুটির প্রবণ।

Joda-Time Java 8 এর আগে ডি ফ্যাক্টো স্ট্যান্ডার্ড ছিল, কিন্তু এর নির্মাতা Stephen Colebourne Joda-Time এর অভিজ্ঞতা এবং এর ত্রুটিগুলি সমাধানের ভিত্তিতে java.time কে অফিসিয়াল প্রতিস্থাপন হিসাবে ডিজাইন করেছিলেন। java.time প্যাকেজ JDK 8 এ অন্তর্ভুক্ত ছিল, কিন্তু Android API 26 পর্যন্ত এটি পায়নি।

ThreeTen-Backport হল java.time এর Java 7 এ একটি পোর্ট, একই লেখক (Stephen Colebourne) দ্বারা তৈরি। এতে সমস্ত প্রধান ক্লাস অন্তর্ভুক্ত: LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant, Duration, Period, DateTimeFormatter। ThreeTenABP এই পোর্টটিকে Android এর জন্য অভিযোজিত করে, AssetsManager এর মাধ্যমে ইনিশিয়ালাইজেশন এবং মোবাইল ডিভাইসের জন্য অপ্টিমাইজেশন যোগ করে।

সুতরাং, ThreeTenABP আপনাকে Android 4.0+ (API 14+) ডিভাইসে OS আপডেটের অপেক্ষা না করে আধুনিক তারিখ/সময় API ব্যবহারের অনুমতি দেয়।

Android প্রকল্পে ThreeTenABP যোগ করা

যোগ করা দুটি ধাপে সম্পন্ন হয়: build.gradle (অ্যাপ-লেভেল) এ নির্ভরতা যোগ করা এবং Application ক্লাসে ইনিশিয়ালাইজ করা। গুরুত্বপূর্ণ: ThreeTenABP এর জন্য কমপক্ষে 21 এর compileSdk এবং কমপক্ষে 4.0 এর Gradle সংস্করণ প্রয়োজন।

নির্ভরতা ডিপেন্ডেন্সিজ বিভাগে যোগ করা হয়: implementation "com.jakewharton.threetenabp:threetenabp:1.4.0"। 1.4.0 রিলিজের পর থেকে, লাইব্রেরিটি আপডেট করা হয়নি, কারণ এটি স্থিতিশীল এবং সমস্ত প্রয়োজনীয় কেস কভার করে।

অফিসিয়াল ডকুমেন্টেশন অনুযায়ী, লাইব্রেরিতে assets এ tzdata অন্তর্ভুক্ত। যদি অ্যাপে আগে থেকে অন্য ফাইল সহ assets ফোল্ডার থাকে, তাহলে ThreeTenABP তাদের সাথে সঠিকভাবে সহাবস্থান করে। tzdata এর সাইজ কমপ্রেসড অবস্থায় প্রায় 200 KB।

groovy
// build.gradle (অ্যাপ-লেভেল)
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation "com.jakewharton.threetenabp:threetenabp:1.4.0"
}

ThreeTenABP ইনিশিয়ালাইজেশন

org.threeten.bp থেকে কোনো ক্লাস ব্যবহারের আগে, লাইব্রেরিটি ইনিশিয়ালাইজ করা আবশ্যক। ইনিশিয়ালাইজেশন Application.onCreate() এ AndroidThreeTen.init(this) কল করে একবার সম্পন্ন হয়।

ইনিশিয়ালাইজেশন assets থেকে tzdata ডেটা লোড করে এবং সিস্টেম ক্লক কনফিগার করে। init() কল না করলে, now() মেথডগুলি IllegalStateException থ্রো করবে যে লাইব্রেরিটি ইনিশিয়ালাইজ করা হয়নি।

পরীক্ষার জন্য, আপনি AndroidThreeTen.init(applicationContext, zoneId) ব্যবহার করতে পারেন — স্পষ্ট সময় অঞ্চল নির্দেশ সহ একটি ওভারলোড। এটি পরীক্ষায় পূর্বানুমানযোগ্য আচরণের জন্য উপযোগী। যদি tzdata ছাড়া শুধুমাত্র বেসিক ইনিশিয়ালাইজেশন প্রয়োজন হয়, AndroidThreeTen.initWithoutFiles(context) ব্যবহার করুন।

kotlin
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}

// ইনিশিয়ালাইজেশনের পরে ব্যবহার
val today = LocalDate.now()
val now = LocalDateTime.now()

কোন ক্লাসগুলি উপলব্ধ?

ThreeTenABP java.time এর সমস্ত প্রধান ক্লাস org.threeten.bp প্যাকেজে প্রদান করে। API মূল java.time এর সাথে প্রায় অভিন্ন, যা API 26+ এ স্থানান্তর সহজ করে।

প্রধান ক্লাস:

  • LocalDate — সময় এবং সময় অঞ্চল ছাড়া তারিখ
  • LocalTime — তারিখ এবং সময় অঞ্চল ছাড়া সময়
  • LocalDateTime — সময় অঞ্চল ছাড়া তারিখ এবং সময়
  • ZonedDateTime — সময় অঞ্চল সহ তারিখ এবং সময়
  • OffsetDateTime — নির্দিষ্ট অফসেট সহ তারিখ এবং সময়
  • OffsetTime — নির্দিষ্ট অফসেট সহ সময়
  • Instant — UTC তে সময়ের মুহূর্ত
  • Duration — সময়-ভিত্তিক সময়কাল
  • Period — তারিখ-ভিত্তিক সময়কাল
  • DateTimeFormatter — ফরম্যাটিং এবং পার্সিং
  • ZoneId / ZoneOffset — সময় অঞ্চল

সহায়ক ক্লাসগুলিও সমর্থিত: Clock, DayOfWeek, Month, Year, YearMonth, MonthDay। সময় অঞ্চলগুলি লাইব্রেরির সাথে বান্ডেল করা হয় (IANA tzdata)। ThreeTenABP 1.4.0 এ tzdata সংস্করণ 2021a এর সাথে মিলে।

ThreeTenABP বনাম desugaring

Android Gradle Plugin 4.0 (2020) এবং desugar_jdk_libs থেকে শুরু করে, ডেভেলপাররা coreLibraryDesugaring এর মাধ্যমে Android এর সকল সংস্করণে java.time ব্যবহারের ক্ষমতা পেয়েছে। Desugaring বাইটকোড রূপান্তর করে যাতে java.time কলগুলি অতিরিক্ত লাইব্রেরি ছাড়া পুরানো API তে কাজ করে।

Desugaring এর সুবিধা: মূল java.time প্যাকেজ ব্যবহার করে (org.threeten.bp নয়), কোনো ইনিশিয়ালাইজেশন প্রয়োজন নেই, Android Studio এর সাথে সম্পূর্ণ একীকরণ। অসুবিধা: AGP 4.0+ প্রয়োজন, বিল্ড সময় বাড়ায়, APK সাইজ 2-3 MB বাড়তে পারে।

ThreeTenABP লিগ্যাসি প্রকল্পগুলির জন্য সর্বোত্তম পছন্দ হিসাবে রয়ে গেছে যারা AGP 4.0+ এ আপডেট করতে পারে না, অথবা যেখানে APK সাইজ গুরুত্বপূর্ণ। ThreeTenABP সেটআপ করাও সহজ — মাত্র একটি নির্ভরতা এবং ইনিশিয়ালাইজেশনের একটি লাইন। Stack Overflow (2024) অনুযায়ী, minSdk < 25 সহ প্রায় 30% প্রকল্প এখনও desugaring এর পরিবর্তে ThreeTenABP ব্যবহার করে।

ব্যবহারের উদাহরণ

প্রথম উদাহরণ ThreeTenABP ব্যবহার করে তারিখ নিয়ে কাজ প্রদর্শন করে। API java.time এর মতো, কিন্তু ইম্পোর্ট org.threeten.bp থেকে আসে। এটি আপনাকে এমন কোড লিখতে দেয় যা স্থানান্তরের পরে শুধুমাত্র ইম্পোর্ট প্রতিস্থাপন প্রয়োজন।

kotlin
import org.threeten.bp.LocalDate
import org.threeten.bp.LocalTime
import org.threeten.bp.Duration

fun isWeekend(date: LocalDate): Boolean {
    val dayOfWeek = date.getDayOfWeek()
    return dayOfWeek == DayOfWeek.SATURDAY ||
           dayOfWeek == DayOfWeek.SUNDAY
}

fun timeBetween(
    start: LocalTime, end: LocalTime
): Duration {
    return Duration.between(start, end)
}

দ্বিতীয় উদাহরণ তারিখ ফরম্যাটিং দেখায়। org.threeten.bp থেকে DateTimeFormatter java.time এর মতোই কাজ করে।

kotlin
import org.threeten.bp.LocalDateTime
import org.threeten.bp.format.DateTimeFormatter

fun formatTimestamp(dateTime: LocalDateTime): String {
    val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
    return dateTime.format(formatter)
}

তৃতীয় উদাহরণ ThreeTenABP এ ZonedDateTime নিয়ে কাজ এবং সময় অঞ্চলের মধ্যে রূপান্তর প্রদর্শন করে।

kotlin
import org.threeten.bp.ZonedDateTime
import org.threeten.bp.ZoneId

fun convertTimeZone(
    time: ZonedDateTime,
    targetZone: ZoneId
): ZonedDateTime {
    return time.withZoneSameInstant(targetZone)
}

ThreeTenABP থেকে বিল্ট-ইন java.time এ স্থানান্তর

minSdk 26 এ বাড়ানোর সময়, আপনি ThreeTenABP বাদ দিয়ে বিল্ট-ইন java.time এ সুইচ করতে পারেন। স্থানান্তর প্রক্রিয়ায় বেশ কয়েকটি ধাপ অন্তর্ভুক্ত এবং পুঙ্খানুপুঙ্খ পরীক্ষার প্রয়োজন।

প্রথম ধাপ হল ইম্পোর্ট প্রতিস্থাপন। org.threeten.bp থেকে ইম্পোর্ট java.time এ পরিবর্তন করা হয়। বেশিরভাগ ক্ষেত্রে, ক্লাসের নাম মিলে: LocalDate → java.time.LocalDate, ZonedDateTime → java.time.ZonedDateTime। ব্যতিক্রম হল DateTimeFormatter — ThreeTenABP এ এটি org.threeten.bp.format এ, java.time এ এটি java.time.format এ।

দ্বিতীয় ধাপ হল ইনিশিয়ালাইজেশন সরানো। লাইন AndroidThreeTen.init(this) আর প্রয়োজন নেই, কারণ java.time Android SDK তে বিল্ট-ইন। Application.onCreate() থেকে কল এবং build.gradle থেকে নির্ভরতা সরান।

তৃতীয় ধাপ হল desugaring দিয়ে নির্ভরতা প্রতিস্থাপন, যদি minSdk 26 এর নিচে থাকে। compileOptions এ isCoreLibraryDesugaringEnabled = true এবং desugar_jdk_libs নির্ভরতা যোগ করুন। এটি ThreeTenABP ছাড়া পুরানো API তে java.time এর কাজ নিশ্চিত করবে। Google I/O (2023) অনুযায়ী, desugaring নতুন প্রকল্পের জন্য পছন্দের পদ্ধতি।

groovy
// build.gradle — ThreeTenABP কে desugaring দিয়ে প্রতিস্থাপন
android {
    compileOptions {
        isCoreLibraryDesugaringEnabled = true
    }
}

dependencies {
    // সরান: implementation "com.jakewharton.threetenabp:threetenabp:1.4.0"
    // যোগ করুন:
    "coreLibraryDesugaring"("com.android.tools:desugar_jdk_libs:2.1.4")
}

// Application থেকে AndroidThreeTen.init(this) সরান

প্রায়শই জিজ্ঞাসিত প্রশ্ন

ThreeTenABP কি desugaring এর সাথে একসাথে ব্যবহার করা যাবে?

প্রযুক্তিগতভাবে — হ্যাঁ, কিন্তু এর কোনো মানে হয় না। যদি desugaring ব্যবহার করা হয়, বিল্ট-ইন java.time ইতিমধ্যে উপলব্ধ। উভয় লাইব্রেরি ব্যবহার করলে কোড ডুপ্লিকেশন এবং APK সাইজ বৃদ্ধি পাবে। আপনার প্রকল্পের জন্য একটি পদ্ধতি বেছে নিন।

কেন ThreeTenABP Application এ ইনিশিয়ালাইজেশন প্রয়োজন?

ইনিশিয়ালাইজেশন IANA Time Zone Database কে assets থেকে মেমরিতে লোড করে। স্ট্যান্ডার্ড JDK তে, tzdata classpath এর মাধ্যমে উপলব্ধ, কিন্তু Android AssetManager ব্যবহার করে। init() মেথড ডেটা সিস্টেম ডিরেক্টরিতে কপি করে, এটি ZoneId এর জন্য উপলব্ধ করে।

ThreeTenABP কোন Android সংস্করণ সমর্থন করে?

ThreeTenABP API 14+ (Android 4.0 Ice Cream Sandwich এবং উপরে) সমর্থন করে। Java 8 সামঞ্জস্য প্রয়োজন (compileOptions এ sourceCompatibility এবং targetCompatibility)। API 26+ এ, লাইব্রেরির প্রয়োজন নেই — বিল্ট-ইন java.time ব্যবহার করুন।

ThreeTenABP এ সময় অঞ্চল কীভাবে আপডেট করবেন?

সময় অঞ্চলগুলি লাইব্রেরির সাথে বান্ডেল করা হয়। সংস্করণ 1.4.0 এ tzdata 2021a অন্তর্ভুক্ত। আপডেট করতে, আপনাকে ThreeTenABP সংস্করণ আপডেট করতে হবে বা assets এ ম্যানুয়ালি tzdata প্রতিস্থাপন করতে হবে। tzdata এর সর্বশেষ সংস্করণ IANA রিপোজিটরি বা ThreeTen-Backport থেকে পাওয়া যেতে পারে।

ThreeTenABP এর সাথে কোড কীভাবে পরীক্ষা করবেন?

ইউনিট পরীক্ষার জন্য, স্পষ্ট অঞ্চল নির্দেশ সহ AndroidThreeTen.init(context, zoneId) ব্যবহার করুন। Robolectric পরীক্ষার জন্য — AndroidThreeTen.init(ApplicationProvider.getApplicationContext())। Android ছাড়া বিশুদ্ধ JVM পরীক্ষার জন্য — ThreeTenABP ছাড়া সরাসরি ThreeTen-Backport ব্যবহার করুন।

সারাংশ

  • ThreeTenABP হল ThreeTen-Backport এর জন্য একটি Android অ্যাডাপ্টার, যা Android < 8 (API < 26) ডিভাইসে java.time API প্রদান করে।
  • Gradle নির্ভরতা com.jakewharton.threetenabp:threetenabp:1.4.0 এর মাধ্যমে যোগ করা হয় এবং Application.onCreate() এ AndroidThreeTen.init(this) ইনিশিয়ালাইজেশন প্রয়োজন।
  • java.time এর পরিবর্তে org.threeten.bp প্যাকেজ ব্যবহার করে — API প্রায় অভিন্ন, API 26+ এ স্থানান্তর সহজ করে।
  • প্রধান ক্লাস: LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant, Duration, Period, DateTimeFormatter — সবগুলি ThreeTenABP এ উপলব্ধ।
  • desugaring (AGP 4.0+) আসার সাথে, ThreeTenABP ঐচ্ছিক হয়েছে কিন্তু লিগ্যাসি প্রকল্প বা APK সাইজ সীমাবদ্ধতার জন্য প্রাসঙ্গিক রয়ে গেছে।
  • java.time এ স্থানান্তর করার সময়, ইম্পোর্ট org.threeten.bp → java.time পরিবর্তন করুন, AndroidThreeTen.init() সরান এবং নির্ভরতা desugar_jdk_libs দিয়ে প্রতিস্থাপন করুন।
  • পরীক্ষার জন্য, পূর্বানুমানযোগ্য আচরণের জন্য স্পষ্ট অঞ্চল নির্দেশ সহ AndroidThreeTen.init(context, zoneId) ব্যবহার করুন।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন