العمل مع التواريخ في Kotlin: نظرة عامة على المكتبات والأدوات
معالجة التواريخ والوقت هي إحدى المهام الرئيسية في أي تطبيق: من تسجيل الأحداث إلى حساب المواعيد النهائية وعرض التقاويم. في Kotlin، كلغة تعمل فوق JVM (وتدعم أيضًا مشاريع المنصات المتعددة)، يتوفر للمطور العديد من المكتبات القوية. في هذه المقالة، سنستعرض ثلاثة مناهج رئيسية: kotlinx-datetime (موصى به للمنصات المتعددة)، java.time (لـ JVM/Android) و Joda-Time (مكتبة أسطورية، لا تزال ذات صلة بالمشاريع القديمة).
1. kotlinx-datetime — المكتبة الرسمية للمنصات المتعددة
kotlinx-datetime هي مكتبة حديثة من JetBrains، تم إنشاؤها خصيصًا لـ Kotlin Multiplatform. توفر واجهة برمجة تطبيقات (API) موحدة للعمل مع التواريخ والوقت والمناطق الزمنية والمدد على جميع المنصات (JVM, JS, Native).
التثبيت (Gradle)
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")}الفئات الأساسية والأمثلة
Instant— لحظة زمنية (UTC).LocalDateTime— التاريخ+الوقت بدون منطقة زمنية.LocalDate— التاريخ فقط.LocalTime— الوقت فقط.TimeZone— المنطقة الزمنية.
import kotlinx.datetime.*
fun main() { // اللحظة الحالية في UTC val now: Instant = Clock.System.now() println("Now UTC: $now")
// التحويل إلى الوقت المحلي (المنطقة الزمنية للنظام) val localDateTime: LocalDateTime = now.toLocalDateTime(TimeZone.currentSystemDefault()) println("Local: $localDateTime")
// العمل مع التواريخ val today: LocalDate = localDateTime.date val tomorrow: LocalDate = today.plus(1, DateTimeUnit.DAY) println("Tomorrow: $tomorrow")
// الفرق بين التواريخ val daysBetween = tomorrow.daysUntil(today) println("Days between: $daysBetween") // -1
// تحليل سلسلة نصية val parsedDate = LocalDate.parse("2025-03-15") println("Parsed: $parsedDate")}2. java.time (ThreeTen-Backport) — المعيار لـ JVM و Android
بدءًا من Java 8، تم تضمين الحزمة java.time (JSR-310) في المكتبة القياسية. بالنسبة لـ Android API < 26، يتم استخدام ThreeTen-Backport (أو ThreeTenABP لـ Android). Kotlin متوافق تمامًا مع هذه الـ API.
التثبيت (لـ Android مع minSdk < 26)
dependencies { implementation("org.threeten:threetenbp:1.6.9")}أمثلة
import java.time.*
fun main() { // التاريخ والوقت الحالي val now = LocalDateTime.now() println("Now: $now")
// إنشاء تاريخ محدد val date = LocalDate.of(2025, Month.DECEMBER, 25) println("Christmas: $date")
// التنسيق val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") val formatted = now.format(formatter) println("Formatted: $formatted")
// الفرق بين التواريخ val start = LocalDate.of(2025, 1, 1) val end = LocalDate.of(2025, 12, 31) val days = ChronoUnit.DAYS.between(start, end) println("Days in 2025: $days") // 364}3. Joda-Time — مكتبة تم اختبارها عبر الزمن
Joda-Time كانت المعيار الفعلي قبل ظهور java.time. اليوم، تُستخدم بشكل أساسي في المشاريع القديمة (legacy). توفر المكتبة وظائف غنية، لكنها تعتبر قديمة — يُوصى بالترحيل إلى java.time أو kotlinx-datetime.
التثبيت
dependencies { implementation("joda-time:joda-time:2.12.7")}مثال
import org.joda.time.*import org.joda.time.format.DateTimeFormat
fun main() { val now = DateTime.now() println("Now: $now")
// إضافة