مقدمة
العمل مع التواريخ والأوقات هو أحد أكثر المهام شيوعًا في التطوير الحديث. سواء كان تسجيل الأحداث، أو حساب المواعيد النهائية، أو عرض التقويم، أو تدويل التطبيق، يحتاج المطور في Kotlin إلى معرفة كيفية معالجة البيانات الزمنية بشكل صحيح. في هذه المقالة، سنشرح بالتفصيل كيفية العمل مع التواريخ والأوقات في Kotlin باستخدام API الحديث java.time، المتاح بدءًا من Java 8 والمتوافق تمامًا مع Kotlin. ستتعرف على الفئات الرئيسية، والتنسيق، والتحليل، والعمل مع المناطق الزمنية، والأمثلة العملية التي ستساعدك على كتابة كود نظيف وموثوق.
الفئات الأساسية للعمل مع التواريخ والأوقات
في Kotlin، كما في Java، يعتمد العمل الأساسي مع التواريخ والأوقات على الحزمة java.time. تم إنشاء هذه الحزمة لتحل محل java.util.Date و java.util.Calendar القديمتين. وهي تقدم فئات غير قابلة للتغيير (immutable) وآمنة للاستخدام مع الخيوط (thread-safe). دعنا نستعرض أهمها.
LocalDate — التاريخ بدون وقت
تمثل الفئة LocalDate تاريخًا (سنة، شهر، يوم) دون مراعاة الوقت والمنطقة الزمنية. وهي مثالية لأعياد الميلاد، أو العطلات، أو تواريخ الأحداث.
import java.time.LocalDate
fun main() { // التاريخ الحالي val today: LocalDate = LocalDate.now() println("اليوم: $today") // الإخراج: 2025-04-11
// تاريخ محدد val specificDate: LocalDate = LocalDate.of(2025, 12, 25) println("عيد الميلاد: $specificDate")
// إضافة أيام val nextWeek: LocalDate = today.plusDays(7) println("بعد أسبوع: $nextWeek")}LocalTime — الوقت بدون تاريخ
إذا كنت تحتاج فقط إلى الوقت (ساعات، دقائق، ثوانٍ، نانو ثوانٍ)، استخدم LocalTime.
import java.time.LocalTime
fun main() { val now: LocalTime = LocalTime.now() println("الوقت الحالي: $now")
val meetingTime: LocalTime = LocalTime.of(14, 30) println("الاجتماع في: $meetingTime")
val oneHourLater: LocalTime = now.plusHours(1) println("بعد ساعة: $oneHourLater")}LocalDateTime — التاريخ والوقت معًا
هذا مزيج من LocalDate و LocalTime. الفئة الأكثر شيوعًا لتخزين لحظة زمنية دون الارتباط بمنطقة زمنية.
import java.time.LocalDateTime
fun main() { val currentDateTime: LocalDateTime = LocalDateTime.now() println("الآن: $currentDateTime")
val newYear: LocalDateTime = LocalDateTime.of(2026, 1, 1, 0, 0) println("رأس السنة: $newYear")}ZonedDateTime و Instant — العمل مع المناطق الزمنية
يضيف ZonedDateTime إلى LocalDateTime معلومات حول المنطقة الزمنية (ZoneId). يمثل Instant لحظة زمنية في UTC (الوقت الآلي).
import java.time.ZonedDateTimeimport java.time.ZoneIdimport java.time.Instant
fun main() { // الوقت في منطقة زمنية محددة val moscowTime: ZonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow")) println("الوقت في موسكو: $moscowTime")
// اللحظة الحالية في UTC val instant: Instant = Instant.now() println("طابع الوقت UTC: $instant")}تنسيق وتحليل التواريخ
لتحويل التاريخ إلى سلسلة نصية (تنسيق) والسلسلة النصية إلى تاريخ (تحليل)، تُستخدم الفئة DateTimeFormatter. وهي تسمح بتعريف أي أنماط.
تنسيق التاريخ إلى سلسلة نصية
import java.time.LocalDateimport java.time.format.DateTimeFormatter
fun main() { val date = LocalDate.now() val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") val formattedDate: String = date.format(formatter) println("التاريخ المنسق: $formattedDate") // الإخراج: 11.04.2025
// أمثلة أخرى للأنماط val formatter2 = DateTimeFormat