العمل مع التواريخ والوقت في Kotlin: تقنيات وواجهات برمجة تطبيقات متقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل المتقدم مع التواريخ والوقت في Kotlin



في التطوير الحديث باستخدام Kotlin، يتجاوز العمل مع التواريخ والوقت مجرد عرض التاريخ الحالي. على المستوى المتقدم، يجب مراعاة المناطق الزمنية، وإجراء حسابات معقدة مع الفترات، وتحليل التنسيقات غير القياسية، ومعالجة الطوابع الزمنية في الأنظمة الموزعة. في هذه المقالة، سنستعرض المكتبات والتقنيات الرئيسية التي ستساعدك على كتابة كود موثوق وفعال للعمل مع التواريخ والوقت في Kotlin.



1. اختيار المكتبة: java.time مقابل kotlinx-datetime



Kotlin متوافق تمامًا مع Java، لذا يمكنك استخدام واجهة برمجة التطبيقات القوية java.time (JSR-310)، والتي تعتبر المعيار للمشاريع الجديدة. ومع ذلك، للمشاريع متعددة المنصات (KMP)، من الأفضل اختيار kotlinx-datetime من JetBrains.



java.time (JVM)

الفئات الرئيسية: LocalDate، LocalTime، LocalDateTime، ZonedDateTime، Instant، Duration، Period.



import java.time.*

fun main() { val today = LocalDate.now() val meetingTime = LocalDateTime.of(2025, 3, 15, 14, 30) val zonedMeeting = ZonedDateTime.of(meetingTime, ZoneId.of("Europe/Moscow")) println("الاجتماع في موسكو: $zonedMeeting")}


kotlinx-datetime (متعدد المنصات)

أضف التبعية في build.gradle.kts:

implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")


import kotlinx.datetime.*

fun main() { val now = Clock.System.now() val date = now.toLocalDateTime(TimeZone.of("Europe/Moscow")).date println("اليوم: $date")}


2. تحليل وتنسيق التواريخ



التحليل الصحيح هو أساس العمل مع البيانات الخارجية. دعنا نستعرض التقنيات المتقدمة.



التحليل بالتنسيقات غير القياسية



import java.time.LocalDateTimeimport java.time.format.DateTimeFormatterimport java.time.format.DateTimeParseException

fun parseCustomDate(dateString: String): LocalDateTime? { val formatters = listOf( DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"), DateTimeFormatter.ofPattern("dd/MM/yyyy'T'HH:mm"), DateTimeFormatter.ISO_LOCAL_DATE_TIME ) for (formatter in formatters) { try { return LocalDateTime.parse(dateString, formatter) } catch (e: DateTimeParseException) { // نجرب التالي } } return null}

fun main() { println(parseCustomDate("2025-03-15 14:30:00")) // 2025-03-15T14:30 println(parseCustomDate("15/03/2025T14:30")) // 2025-03-15T14:30}


التنسيق المترجم



import java.time.LocalDateimport java.time.format.DateTimeFormatterimport java.time.format.FormatStyleimport java.util.Locale

fun main() { val date = LocalDate.of(2025, 3, 15) val usFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withLocale(Locale.US) val ruFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withLocale(Locale("ru")) println("الولايات المتحدة: ${date.format(usFormatter)}") // Saturday, March 15, 2025 println("روسيا: ${date.format(ruFormatter)}") // суббота, 15 марта 2025 г.}


3. الحسابات المعقدة مع Duration و Period



Duration — للفترات الزمنية الدقيقة (ساعات، دقائق، ثوانٍ)، Period — للفترات التقويمية (سنوات، أشهر، أيام).



الفرق بين التواريخ مع مراعاة منطق الأعمال



import java.time.*import java.time.temporal.ChronoUnit

fun businessDaysBetween(start: LocalDate, end: LocalDate): Long { var count = 0L var current = start while (current.isBefore(end)) { if (current.dayOfWeek != DayOfWeek.SATURDAY && current.dayOfWeek != DayOfWe

المدونات

توصيات الكتب